2

私は、比較的多数 (数十万) の行を含む可能性がある SQL データベースにテーブルがあるプロジェクトに取り組んでいます。

このプロジェクトは PHP で書かれており、PDO を使用してデータベースにアクセスしています。このプロジェクトでは、「レポート」などを実装するために、データを表示するコンテキストに応じて、さまざまなプロパティでデータをフィルター処理して、このテーブルから行を選択できる必要があります。

この種の状況で非常に優れた設計がどのようなものになるのか、私は興味があります. これには次のオプションを考えましたが、どれもあまり好きではありません。

  • 異なるフィルタリング手法ごとに個別のクエリ (API 関数など) を記述します。これは、各関数で SQL の 90% を複製することになり、維持するのが難しいため、望ましくないように思えます (たとえば、クエリの 1 つを変更または修正する必要がある場合、代わりにすべてのクエリを変更または修正する必要があります)。 1つだけ)。
  • SQL を使用する代わりに、フィルタリングされていない行のリストを取得し、アプリケーションでフィルタリングする単一の API 関数を提供します。アプリケーションが気にしない行を処理するために多くの労力を浪費しているため、これは望ましくありません。
  • WHERE提供された場合、クエリの句を変更するさまざまなオプションのパラメーターを使用して、単一のクエリで単一の関数を記述します。これはおそらく私がこれまでに持っていた最良のオプションですが、本当に奇妙なシグネチャを持つ関数を持ち、WHEREかどうかに応じて句を変更するための一連の三項ステートメントを持つことを意味するので、私はまだそれが好きかどうかはわかりません引数が与えられました。

このタイプの機能を提供する API を設計するための一般的に受け入れられているプログラミング パターンは 1 つ以上ありますか?

4

2 に答える 2

2

最も簡単なのは、ORM を使用して次のようなものを作成することです。

ORM::getTable('api')->getBaseQuery('get')->filterSomething()->execute();

getBaseQuery が WHERE なしで部分を返し、複数の filterSomething が条件をベースに追加するようにします。

オブジェクトを使用するだけの場合は、ベースクエリを基本クラスまたはインターフェイスに配置して同じことを行い、特殊なクエリに条件を使用してベースクエリを実装/継承させます。

プレーンな php を使用する場合、私は戦略パターンを使用します: http://www.phptherightway.com/pages/Design-Patterns.html (スクロールする必要がありますが、残念ながらそこにはアンカーがありません)。

于 2013-10-11T20:40:47.040 に答える
1

変更するのが where 句だけの場合、クエリの最初の部分を定数などとして 1 つのオブジェクト (またはプロパティなど) に格納し、クエリごとに最初の部分を取得する関数を用意できます。クエリと where 句に追加します。

于 2013-10-11T20:31:45.840 に答える