2010-11-29 6 views
2

申し訳ありませんが、わかりやすいタイトルのために、私が意味することを明確にするために注意深い説明が必要です。データベースエンティティとその依存関係のローカル情報正しいデザインですか?

私は、オブジェクトのセットを保持し、それらを必要に応じて返す役割を持つデータベース(簡単なコレクションとして意図されている)を持っているとします。例として、Foo型のオブジェクトを保持するFooDatabaseがあります。これらのFooオブジェクトは、FooDatabaseの調整のもとにファイルからロードされます。

ここで、追加の情報をFooオブジェクトに格納する必要があります。この追加情報はファイルでは利用できませんが、各Fooに関連しています。技術的には、この情報が各Fooの責任の範囲内で自己詳細に記述されている場合、実際の問題はありません。Fooはそれぞれ情報を計算し、それをそれ自身に保管します。

残念ながら、私のケースはもっと複雑です。この情報は、トピックに関するFooだけでなく、データベースに格納されている他のFooオブジェクトにも依存しています。 Fooの情報

  • Iデリゲートを計算するために必要な他のFooオブジェクトを探すためにデータベースを照会できるように、私はFooのオブジェクトにデータベース自体を渡す

    1. :私はこの問題を解決するための二つの可能性を持っているでしょうこの情報をデータベースオブジェクトに計算する責任は、「全体像」を見ることができる唯一のものです。 Fooごとに情報が計算されると、その情報はデータベースによってプッシュされます。 Fooオブジェクトはこれが起こるまでダミーの情報を保持します。

    あなたは既にこの問題を抱えていますか?そのような場合の合意されたデザインは何ですか?

  • +0

    「他のFooオブジェクトが必要です」という情報はどのように記録されますか?関連するFooオブジェクトのリストと共にFooオブジェクト "A"を返すと、新しく生まれたFooオブジェクト "A"が欠落情報をDBに照会できるようになりますか? –

    +0

    @ p.marino:私はFoo( "one")とFoo( "two")を持っていますが、Foo( "one"、 "two")情報 –

    +0

    DBにいくつかの動作を追加して、各ノードの依存関係のリスト(foo [1]とfoo [2]は空、foo [1、2]は["1"、 "2" 2]?そしてfoo [1,2]がリスト自体に基づいて追加の情報をDBに問い合わせることを許可しますか? –

    答えて

    0

    私がRepository Patternと似たようなデータベースと呼ぶものは、基礎となるデータストアから特定のFooをクエリするための操作のためのインタフェースを提供します。 Fooオブジェクトは単にデータを保持し、それを取得するためのメソッドを提供します。私の経験では、関連するFooオブジェクトが必要な頻度に基づいて適用される2つのオプションがあります。

    オプション1:ビルダー

    あなたがそれらを必要とする場合は、ほとんどの時間は、この状況に対処するためにBuilder Patternを使用します。 FooBuilderには、データベースから提供された操作を使用して、データベースを照会し、Fooオブジェクトに必要なデータを入力します。あなたが特定のFooを必要とするときはいつでも、あなたはあなたのために完全に満たされたFooを生成するBuilderを呼び出します。

    オプション2:遅延読み込み

    あなたは非常に頻繁に関連Fooのデータを必要としない場合は、遅延ロードソリューションを実装することができます。これは、State Patternを使用して行うことができます。これを実装するには、FooBuilderにBuildUnfilledFooメソッドがあり、初期Fooだけを読み込み、UnfilledStateを提供します。 UnfilledStateは、追加のデータを必要とするメソッドを実装します。まず、FilledStateで必要なFoosを取得し、FilledStateを呼び出して操作を実行します。ここで

    は、あなたが提示し、他のオプションについての私の考えです:あなたがに循環依存関係を導入している、コメントで指摘したように

    はFooのオブジェクトに

    • をデータベース自体を渡しますアプリケーション。
    • データオブジェクトをデータベースの実装に依存させると、将来的にデータ実装を変更するのが難しくなります。

    委任それは本当に唯一のデータを処理するときに、データベース

    • にこの情報を計算する責任は、これは、データベースのデータオブジェクトの構築に関連したビジネスロジックの所有者になりクエリ