2010-12-11 3 views
1

私は自分の仕事でアーキテクチャの再設計に取り組んでおり、基本的にはゆるやかに基本的なMVCカスタムソリューションを採用しました。その意図は、システムの各モデルで定義されている標準のCRUD操作と追加のリスト操作を持つことです。PHPの比較的シンプルなCRUDモデルシステムでは、複雑な結合はどこに収まるでしょうか?

残念ながら、私たちのシステムのコードの約30%は複雑な結合を使用していましたが、このモデルに適合しない高度なクエリが使用されていました。つまり、モデルに合うかもしれませんが、リスト関数は巨大で、確かにエラーが発生しやすくなります。これは、書き直しで解決しようとしているものです。

このようなシステムで、複雑で非常に特定のクエリはどこに配置しますか?私たちはいくつかの選択肢をもっていました。

  1. リストの複数のバージョンを追加/基本的なもの
  2. に加えて、取得モデルディレクトリ
  3. の兄弟として存在し、これらのクエリは、このような状況でモデルを使用して追加しないでくださいのためのカスタムモデルに追加します。動作中の作業

私たちはヘルプをアウトソーシングしていますので、私たちは実装と保守性に関してできるだけシンプルにしています。 ORMの解決策や他の重量は問題になりません。

このようなことは、開発者としてどこに見たいですか?

答えて

2

私は明らかにコメントするために必要な権限が不足しているので、私は答えとしてこれを掲示しています...

あなたが例やモデルに適合しないあなたが持っているクエリの種類のうちの2つを提供することができます?一般的に言えば:良いORMはあなたを長くしてくれますが、実際にはクエリが簡単すぎて簡単にマッピングできません。また、チームのSQLスキルが高い場合、ORMもそのように見える可能性があります。

+0

現時点で実際のサンプルにアクセスできない例えば報告を取る。 5つ以上の結合、列のロールアップ、1トンのカウントの追加、カウントアップによる統計の変更などが可能です。私たちはクエリを細かく調整する能力が必要なのでORMが邪魔になることに同意するでしょう。(私たちは1億レコード以上を持っています。)DB300を犠牲にするために若干の間違いがあります。 – methodin

+0

報告が必要ないMVC設定柔軟ではあるが高度にチューニングされただけで、私はReporterモデルを持つようにし、他のモデルはできるだけシンプルに保ちます。これはより多くの "エキスパートレベル"のクエリを分離し、それらのパラメータの使用に近いパラメータ検証を維持するのに役立ちます。 は、その後、あなたのReporterのモデルの中で、私は可能な限りのための構成可能なクエリビルダを使用し_still_だろうが、それはよりは好みの問題だし、普通のSQLを使用するよりも、多かれ少なかれ仕事ですか。 – grncdr

0

まず、すべてのクエリはモデルにとどまるべきです。 第2に、mvcフレームワークのほとんどは、クエリ文字列を渡すことができるクエリ機能のようなデータベース操作のための単なる単純なものではありません。この場合は、手動でクエリを作成するか、for Zend_Db_Table_Selectの例では、複数の結合をうまく処理します。また、Zend以外の場所でもCodeigniterと言えば、モデルのクエリビルダーを提供しています。ここでは、ジョインを追加したり、他の種類の複雑なクエリを作成したりできます。

あなたはベースモデルクラス(モデルのそれぞれを拡張するもの)にクエリビルダーの機能が必要なように見えるので、クエリをビルドできるようになりますあなたは好きなモデルを好きです。

+0

このアプローチの問題は、リストモデルの関数が大きくなることです。私たちは多量のレポート機能を備えているため、これらの複雑なシナリオを処理するためにモデルを拡張するだけでは、やりたいことではありません。与えられたモデルを処理するために、モデル内に別の関数が必要な場合や、ジョインなどを渡す必要がある場合... – methodin

0

私は最初から構築してきたMVCフレームワークで似たような問題があります。

複雑なクエリでSELECT *のオーバーヘッドが特に気に入らないので、私はその機能を何も構築しませんでした。

コードの処理が遅くなりますが、関連するクラスですべてのクエリを手作業で記述しています(私のモデルはクラスの99%を呼び出します)。

さまざまなルーチン間で共有される非常に複雑なクエリの場合、汎用結合を返し、その特定のクエリの追加パラメータを連結する関数があります。


要求として提供例:

private function returnFindClientRequests(){ 

     $query = "SELECT 
     SR.sign_project_name, SR.module_signregister_id_pk 
     ,SRI.module_signregister_sign_id_pk,SRI.sign_location_address 
     ,SRR.status, SRR.module_signregister_item_client_request_id_pk, SRR.client_comment, SRR.requested_by_user, SRR.date_created 
     ,SRR.admin_comment, SRR.date_actioned 
     ,CL.client_name, CL.module_client_id_pk 

     FROM 
     `module_signregister` SR, `module_signregister_item` SRI, `module_signregister_item_client_request` SRR, `module_client` CL 
     WHERE 
     SR.module_signregister_id_pk = SRR.module_signregister_id_pk 
     AND SRR.module_signregister_sign_id_pk = SRI.module_signregister_sign_id_pk 
     AND SRR.requested_by_group = CL.module_client_id_pk 
     AND " . Database::groupQuery('CL'); 

     return $query; 

    } 

このクエリは、私たちはの多くにセッション固有の変数を返すために使用することを他のいくつかの機能で共有だけでなく、データベースへの呼び出しを使用しています:: groupQuery()されますクエリ。

+0

このようなシステムで複雑なクエリがどのように表示されるかの簡単なサンプルを提供できますか? – methodin

0

モデルはワーカーです - 100個のレポートがある場合、潜在的に100個のモデルが必要になります。結合はMVCとは関係がありません。データがどのように扱われるかは、まったく別のパターンです。 ORMを使用しておらず、アクティブなレコードを使用していない場合は、モデルを介してSQLをサーバーに直接送信します。おそらく、専用のデータベースクラスを介して、モデルはクエリとその結果を処理します。

関連する問題