1

私たちのプロジェクトには、複雑な関係を持つ最大 40 個のテーブルがあります。同僚は、長い結合クエリを使用することを信じているため、モジュール外のテーブルについて学習する必要がありますが、モジュールに直接関係のないテーブルについては気にせず、データ アクセス関数を使用する必要があると思います (他のモジュールの責任者によって書かれている) それらからのデータが必要な場合。明確にさせてください:

私は、顧客がベンダーに連絡して、特定の製品について会話を開始できるようにする ContactVendor モジュールを担当しています。製品モジュールには、独自の複雑なテーブルと、詳細をカプセル化する関数との関係があります (たとえば、i18​​n、アクティベーション、製品の可用性など...)。ここで、ベンダーと顧客の間の会話に関連する製品の製品タイトルを表示する必要があります。製品情報と会話内容を一度に取得する長いクエリを作成するか (これにより、製品テーブルについて学習する必要があります)、または関連する product_id を get_product_info(int) 関数に渡すことができます。

最初のアプローチは明らかに要求が厳しく、多くの悪い慣行や、私が通常プログラミングの欠点と考えるものを導入します。2 番目のアプローチの問題は、これらのアクセス関数が無数の小さなクエリを引き起こすことであり、それぞれが個別のクエリを実行する関数を使用してループが 100 個の製品の製品タイトルをフェッチしようとすると、パフォーマンスの低下が懸念されます。そのため、「実装にコーディングしないで、インターフェースにコーディングする」とパフォーマンスの間で立ち往生しています。物事を行う正しい方法は何ですか?

更新: モジュールの外部にあるこれらのテーブルに対する将来の変更の可能性について特に心配しています。製品モジュールが彼らのやり方を変えることにした場合はどうなるでしょうか? または何らかの理由でスキーマを変更しますか? これは、変更がそれらに統合されるまで、一部の他のモジュールが破損または誤動作することを意味します。いつもの波及問題。

4

3 に答える 3

1

ここでビューを操作するのはどうですか?

get_product_info 関数を呼び出す代わりに、すべてのモジュール メンテナにそのモジュールへのビュー (product_info_view など) を提供させ、このビューをクエリで使用します。このように、そのようなビューの内部 (テーブル) について心配する必要はありませんが、データベース エンジンがコードとビューを含む最終的なクエリを簡素化するため、パフォーマンス上の利点が得られます。

于 2010-06-18T12:24:37.067 に答える
1

この種のもの (永続性/データ ソース/ORM) を行う正しい方法は、Martin Fowler の素晴らしい本である Enterprise Application Architecture のパターンで非常によく説明されています。この本は、エンタープライズ開発に携わるすべての人にとって必読です。

于 2011-01-20T07:16:29.320 に答える
1

質問の両面を見ることができます。ただし、約 40 のテーブルしかないということを考えると、たとえば、専門分野以外の 30 の他のテーブルとやり取りする複雑さは最小限に抑えられているように思えます。複雑な結合を行うクエリを作成することに投票します。結局のところ、テーブル内の正確な列を知ることは簡単なはずですが、実際に知っておく必要があるのは、それらのテーブルが使用する特別な関係または特別な意味です。

しかし、私にとって決定を下す可能性のあるもう1つの事実は、パフォーマンス要件は何ですか? システムが現在十分に高速であり、ハードウェアとテーブルのサイズが、テーブルごとに個別のクエリを使用しても十分に高速である場合は、全員の生活が楽になるのであれば、2 番目のアプローチを使用して実行してください。しかし一方で、誰かが速度について不満を言ったことがある場合、またはテーブルが将来際限なく増加する可能性がある場合、またはユーザー数が増加する可能性がある場合は、最も期待できる方法を使用してください。もっと早く。

コメントへの応答:必ずしも。製品モジュールが 5 つの新しい列を追加したとします。それらをまだ使用していないため、それらに参加したり取得したりせず、選択した方法に関係なく影響を受けないか、それらが必要であり、それらを処理する方法について新しいコードを作成する必要があります。いずれにせよ、どちらの方法を選択しても、あなたの側の変化は同じです。Product モジュールが名前を変更したか、3 つの列を削除したとします。次に、インターフェイスの記述方法に関係なく、返された値の処理方法を変更する必要があります。あなたが何を得ているかはわかりますが、肝心なのは、変更に関連するフィールドを使用する場合は、コードを変更する必要があるということです。フィールドが使用されていない場合は、使用しないでください。使用するのではなく、必要な列のみをフェッチする場合、言及する「波及効果」は存在しないはずですselect * from tblクエリ。

于 2010-06-18T11:56:38.293 に答える