0

ここに私のクラスがあります:

class PriceScale
-int ID
-float bookingFees
-Product product
-List<PricePeriod> periods

Class Product
-int ID
-string name
-List<PriceScale> priceScales

class PricePeriod
-DateTime begin
-DateTime end
-float price
-PriceScale scale

ご覧のとおり、「製品には多くの価格スケールがあり、価格スケールには多くの期間があります」というビジネスルールを厳密に適用しました。

私の問題: たとえば、Product クラスを扱っているとき、「priceScales はロードされていますか?」と自問するのは好きではありません。(製品が必要になるたびにロードするわけではないため)

解決 :

1/ 遅延読み込み : 私はそれが好きではありません.SQL クエリを知らないうちに実行すると、1+n クエリの問題が発生する可能性があります (私は価格計算システムに取り組んでいるので、本当にそうする必要があります)どのSQLクエリが実行されるかを確認してください)

2/ 常にロードする : 私はそれが好きではありません。なぜなら、このロジックをすべてに適用すると、データベース全体をロードすることになるからです。

3/ 構成 (メンバー priceScales) を削除します。その場合、価格スケールを処理する最善の方法は次のとおりです。

  • キーが製品 ID である Dictionnary<int,List<PriceScales>> を取得しますか?

  • 他の何か?

4/ メソッドの最初に、priceScales が必要な場所に追加します

checkPriceScalesAreLoaded(productList);

遅延読み込みのように見えますが、より明示的です。

5/ 私が考えもしなかった他の何か :)

ありがとう

4

2 に答える 2

0

ここのように複数の結果セットクエリを作成することにしました

http://vb.net-informations.com/ado.net-dataproviders/ado.net-multiple-result-sets.htm

于 2011-12-15T11:05:14.153 に答える
0

私には、これは永続性の問題のように思えますが、OOP や構成とはあまり関係がありません。

オブジェクトを DB からロードしていますか? もしそうなら、どの言語と永続化メカニズムを使用していますか? これは可能な解決策に大きく影響します。

たとえば、Java と Hibernate の場合、推奨される方法は、デフォルトの遅延フェッチ戦略を使用してから、パフォーマンスを測定し、必要に応じて微調整 (ローカルでフェッチ戦略を選択的に切り替える) することです。残りの遅延フェッチ戦略を維持しながら、個々のマッピング/プロパティ/クエリで熱心なフェッチ、またはバッチ/結合クエリに切り替えることができます。

于 2010-09-03T09:41:36.413 に答える