2017-01-20 11 views
2

質問にはタイトルではあまり明確ではないかもしれませんが、私に説明させてください:エンティティは何度もエンティティとして使用されていますか?

私のモデルでは、私には住所がある人がいます。ただし、多くの人が同じ住所を共有することができます。

私は自分のモデルを定義していたので、私はPersonがEntityだと仮定しましたが、Addressの単一のプロパティを変更すると、それはもはや同じAddressではないのでValue Objectになります。

複数のPersonがアドレスを共有できるので、データベース実装に直接ジャンプし、その人にaddress_xxxxフィールドがあると仮定すると、データベースに重複が多すぎるでしょうか?アドレステーブルに関連するaddress_idフィールドを持っている方が良いのでしょうか?その場合、Addressはエンティティの権利ですか?

+2

永続性モデル(別名データベース)とドメインモデルを混同しないでください。 Addressがドメイン内の値オブジェクトの場合は、そのように扱います。永続性は単なる実装の詳細です。 – Cerad

+0

@cerad確かに、遅かれ早かれ私はそれに対処しなければならないでしょう。私はアドレスをエンティティにすることについてますます考え始めています。ドメインのある時点では、固有のアドレスのリストを提示する必要があるからです。それはエンティティをアドレスにしますか? – Lucio

+2

人の外にあるアドレスを処理する必要がある場合は、定義上、ドメインエンティティになります。アプリケーションが実際にそれらを必要としない限り、ドメイン駆動型設計手法を適用しようとすることに注意してください。ほとんどの場合、あなたは素早く自分自身を結びつけることができません。 – Cerad

答えて

3

私のモデルでは、住所を持っている人がいます。ただし、多くの人は同じアドレスを共有することができます。

アドレステーブルに関連するaddress_idフィールドがある方が良いですか?その場合、Addressはエンティティの権利ですか?

ドメインモデルとパーシステンスモデルという2つの異なるモデルがあり、どちらもコンセプトがエンティティであるか値であるかが一致しないことがあります。

最初にする必要があることは、ドメインの観点からアドレスが何であるか自分に尋ねることです。あなたのドメインはアドレスのライフサイクルに関心があるのですか、それとも不変の値ですか?たとえば、アドレスに入力ミスがあるとどうなりますか?間違ったものを破棄して置き換えるか、元のアドレスの詳細を変更して連続性を追跡しますか?これらの質問は、アドレスがエンティティかドメインの観点からの値かを判断するのに役立ちます。

ここで、コンセプトは、永続性モデル内のエンティティである一方、ドメイン内の値であってもよい。たとえば、ドメイン内のアドレスのライフサイクルには関心がありませんが、ストレージスペースの最適化が非常に重要です。その場合、DB内の一意のアドレスに識別子を付けて、同じアドレスの詳細を複数回コピーするのではなく、関係に使用することができます。

しかし、そのようにすると、モデル間にさらに緊張が生じるため、実際の利点があることを確認する必要があります。

5

エンティティが何度もエンティティとして使用されていますか?

ありませんが、それは依存...

それは多くの場合、値オブジェクトが明示的にモデルで実現していないかもしれないことを、実際のエンティティのプロキシ識別子である場合です。例えば

:あなたは慎重にそれを見れば

1600 Pennsylvania Ave NW 
Washington, DC 
20500 

、あなたはそれが

  • 名の通り
  • 名前に埋め込まれて表示されます市

あなたのモデルで通り/都市エンティティへの参照である場合、「アドレス」は、あるエンティティ(例:「ホワイトハウス」)の現在の状態の表現です。

複雑なこと - モデルに適した抽象化が必要です。

はお金考えてみましょう: "異なる" USDと100:

{USD:100} 

値型だ、我々はどのUSDを置き換えることができます100

{USD:100, SerialNumber:KB46279860I} 

まだ値(それの状態)です、それは循環中に存在する特定の請求書の状態(どこか)です。ここにあるのはという情報リソースであり、現実世界のどこかでエンティティを説明しています。

また、一致プロパティについても注意する必要があります。例えば;通りの名前が変わる - 住所の価値が変わるべきか?モデルが場所の現在の識別子を気にしている場合は、おそらくそれが必要です。モデルが2か月前にあなたが封筒に入れた情報を追跡しているのであれば、確かにそうすべきではありません。 (つまり、ストリートエンティティのラベルを変更したとき、エンベロープエンティティにすでに印刷されているラベルは変更されませんでした)。

重要な質問ですが、答えはその時点でモデリングしているものによって変わります。

関連する問題