orm - DDD : subclasses & root entities

标签 orm domain-driven-design entity aggregate

假设我有典型的实体汽车

class Car : Entity
{
    public double MaxSpeed { get; set; }
    public Color Color { get; set; }
    /* ... */
}

在我的域模型中,该实体将是集合根实体

现在,让我说我专门研究汽车。我创建了一个法拉利,法拉利的快乐拥有者喜欢用一个昵称来称呼他们:
class Ferrari : Car
{
    public string Nickname { get; set; }
}

假设我有另一个实体,即公司实体。这将是另一个集合根实体。有很多人在公司工作,由实体Person代表。人可能有车。但是公司的总裁通常非常富有,这种人有法拉利:
class President : Person
{
    public Ferrari Ferrari { get; set; }
}

在这种情况下,我有一个实体总裁,他在公司聚合的中是,它引用了法拉利,这是另一个聚合的根实体的特化。

鉴于DDD,这是否正确? 我可以/应该考虑将根实体本身专门化为同一聚合的根实体吗?我的意思是,在我所描述的领域中,法拉利实体是否也是汽车集合体的根实体(因为法拉利也是汽车)?

现在,我们必须将此模型坚持到数据库。我认为我的问题不取决于我将使用的OR/M框架。

我应该如何构建包含Cars
表?我是否应该使用“CarType”列(可能的值:“Car”,“Ferrari”)和可空的“昵称”列构建单个表Cars?

还是应该为Cars建立一个表,为Ferraris建立一个表,后者的PK为Car FK?

谢谢!

最佳答案

我认为您通过创建这些实体的具体类型开始失去系统的很多灵活性。我所暗示的关系类型通常是我与“类型”实体所处理的。例如,您有车。法拉利是汽车的一种。从中继承的两个实体是Car和CarType。

谈论这种方式的方式是,每次引入新类型时都必须添加新实体。如果您要捕获的只是汽车的“昵称”,我认为那只是另一部分数据,而不是另一实体。除非您在不同类型的Car实体中具有不同的数据(即,不同的属性名称)和/或行为差异,否则使用此方法不会有太多好处。我宁愿使用诸如FindCarByType()之类的存储库方法并处理一种类型的实体,以降低风险。

我绝不是DDD专家,我正在为某些概念而苦苦挣扎(或更像是在为某些概念的多种解释而苦苦挣扎)。我发现没有100%的纯实现,并且我所看到的每个实现都有细微差别。

编辑之后

我发现我误解了您所写内容的一部分。我知道这个昵称并不适用于所有车辆,而仅适用于法拉利:汽车。我认为答案确实是“取决于”。您在模型的其余部分中拥有多少个领域特化知识?在法拉利实体中,昵称可能很普遍,但这是专有的吗?它不仅与实际数据有关,而且与要求有关。基本上,这取决于您对这些实体所期望的特化程度。

关于orm - DDD : subclasses & root entities,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1337953/

相关文章:

python - 更新django中外键模型的数据

domain-driven-design - 完全开发的 DDD 和 Onion 架构示例

hibernate - CRUD 使用 Hibernate 但没有任何实体

java - 错误: Not an entity.但是@Entity和persistence.xml正确

javascript - TypeORM 插入与relationId

sql - 数据库中的多态性

c# - DDD\CQRS\Event Sourcing 和请求历史数据

java - 共享所有 Hibernate 实体的公共(public)查询结果

java - Eclipse + MySql + Hibernate,一个好的介绍?

architecture - 在域模型实现中是否应该考虑 UI 项目类型?