4

単一のデータベース呼び出しからビジネス オブジェクト階層 (親/子/孫) 構造を作成するためのベスト プラクティスを知りたいです。

頭のてっぺんからそれを達成するために、次のようないくつかの方法を考えることができます。

SQLステートメントのすべての関係を左結合し、ループとロジックを使用してビジネスオブジェクトを埋めます

また

複数の select ステートメントと 1 つの datareader を使用し、その NextResult() メソッドを使用して各結果セットを反復処理し、対応する BO を埋めます

これのベストプラクティスは何ですか

DAL に DAAB と c# を使用しています

ありがとう!

4

5 に答える 5

4

普遍的なレシピはありません。これは、データベース スキーマ、データベース サイズ、およびアプリケーションが一般的なシナリオで読み取るレコード数によって異なります。ここには 2 つのプロセスがあります。

  • データベースからデータをフェッチする
  • ビジネス オブジェクトの設定

データベースからデータをフェッチするのは、メモリ内にオブジェクトを作成するよりも数倍遅くなります。最善の方法は、最速のデータ アクセスのために select ステートメントを作成することです。

クエリは、次の 3 つの方法で作成できます。

  • 1 回の実行ですべてをフェッチする 1 つの大きなクエリ - 最も複雑な SQL を取得し、おそらく最速の実行になります (DB スキーマによって異なります)。
  • マスター/詳細アプローチ - 単純なクエリ。データベースへの大量のトラフィック。これは、少数のレコードを取得する場合にのみ許容されます。それ以外の場合は非常に遅くなります。
  • ハイブリッド: 階層のレイヤーごとに 1 つのクエリ。前の 2 つの方法が遅い場合は、この方法を検討してください。この方法では、ビジネス オブジェクトを設定するためにより複雑なロジックが必要になります。

どのソリューションが受け入れられるかを判断する必要があります。考慮すべきいくつかの重要なポイント:

  • 1 回の読み取りですべてをフェッチする 1 つの大きな SQL と、複数の小さな SQL のどちらを作成して維持するのが簡単か。
  • 前のポイントで選択する場合は、パフォーマンスを測定して最終決定を下す必要があります
于 2009-01-14T01:55:20.227 に答える
1

以前は複数の返されたデータセットを使用していましたが、オーバーヘッドとそのための常に変化する API により、最終的に結合を使用してすべてを一度に返すことに戻ることができました。

私は結果セットのサイズに注意を払っていますが、私が遭遇したアプリのコンテキストでは問題ではありませんでした. 全体的に後悔はしていませんが、YMMV.

親レベルの選択句に子レベルの選択規則が含まれている場合、複数の結果セットが特に厄介になる可能性があります。

この方法ですべてのケースを処理します。分割するとうまくいく場合もありますが、場合によっては単一セットのクエリが必要になります。パターンが 1 つだけあると便利です。特に、あるパターンから別のパターンへのリファクタリングに行き詰まっている場合は特にそうです。

最後に、データベースへのヒットが少なくなり、トランザクション管理がより簡単になります。

于 2009-01-14T01:39:33.253 に答える
0

DataReader NextResult は、パイプを通過するデータの量が結合アプローチほど急速に増加しないため、最適です。

于 2009-01-14T01:11:39.487 に答える
0

NHibernate などの OR マッパーの使用を検討しましたか? Eager ローディングは、データベースへの 1 回の呼び出しで要求したことを実行できます。

OR Mapper を選択できない場合は、datareader.NextResultSet に投票します。

于 2009-01-14T02:14:17.647 に答える
0

すべての行が同じテーブルからのものである (またはそうであると思われる) 場合、単項関係を持つデータセットにデータをプルすることができ、ADO.NET が階層をリンクします。

于 2009-01-14T02:25:12.023 に答える