私が典型的なエンティティCarを持っているとしましょう
class Car : Entity
{
public double MaxSpeed { get; set; }
public Color Color { get; set; }
/* ... */
}
このエンティティは、私のドメインモデルでは、Aggregateのルートエンティティになります。
今、私が車を専門にしているとしましょう。私はフェラーリを作成します、そしてフェラーリの幸せな所有者はニックネームでそれらを呼ぶのが好きです:
class Ferrari : Car
{
public string Nickname { get; set; }
}
別のエンティティであるCompanyエンティティがあるとします。これは、別のAggregateのルートエンティティになります。エンティティPersonに代表される、会社で働いている多くの人々がいます。人は車を持っているかもしれません。しかし、会社の社長は通常非常に裕福であり、この種の人々はフェラーリスを持っています:
class President : Person
{
public Ferrari Ferrari { get; set; }
}
この状況では、別のアグリゲートのルートエンティティのスペシャライゼーションであるフェラーリへの参照を保持している、CompanyAggregate内にあるエンティティPresidentがいます。
これはDDDの観点から正しいですか?ルートエンティティ自体の特殊化を同じ集合体のルートエンティティと見なすことができますか/すべきですか?つまり、私が説明したドメインでは、エンティティFerrariはCar Aggregateのルートエンティティでもありますか(FerrariもCarであるため)?
ここで、このモデルをデータベースに永続化する必要があるとしましょう。私の質問は、使用するOR/Mフレームワークに依存しないと思います。
車を保持するテーブルをどのように作成すればよいですか?「CarType」列(可能な値:「Car」、「Ferrari」)とnull許容のニックネーム列を持つ単一のテーブルCarsを作成する必要がありますか?
または、車用のテーブルとフェラーリ用のテーブルを作成する必要があります。後者のPKは車のFKです。
ありがとう!