我并没有见过具体的例子,但我认为它们保存在数据库中包含实体表内。
比如说,如果我有一个名为Person的实体/聚合根以及相应的Person表,如果它有一个叫做Address的值对象,那么Address的值将保存在这个Person表中!
对于一个拥有其他实体(例如公司等)都有地址信息的领域,这种方法是否适用呢?
(我正在编写一个项目管理应用程序,并试图学习DDD)
我并没有见过具体的例子,但我认为它们保存在数据库中包含实体表内。
比如说,如果我有一个名为Person的实体/聚合根以及相应的Person表,如果它有一个叫做Address的值对象,那么Address的值将保存在这个Person表中!
对于一个拥有其他实体(例如公司等)都有地址信息的领域,这种方法是否适用呢?
(我正在编写一个项目管理应用程序,并试图学习DDD)
根据您所描述的原因,将值对象(Value Objects)存储在单独的表中是可以的。然而,我认为您可能对实体(Entities)与值对象(VOs)的区别有些误解 - 这与持久性无关。
举个例子:
假设一个公司(Company)和一个个人(Person)都有相同的地址(Address)。下面哪种说法您认为是正确的?
如果1是正确的,那么地址应该是一个实体,因此应该有它自己的表格。
如果2是正确的,那么地址应该是一个值对象。它可以作为父实体表格中的组件进行存储,或者可以拥有自己的表格(更好的数据库规范化)。
正如您所看到的,地址的持久化方式与实体/值对象语义无关。
大多数开发人员在处理问题时往往优先考虑数据库。而领域驱动设计并不关心持久化的处理方式,这是由存储库来处理的。您可以将其持久化为xml、sql、文本文件等。实体/聚合根/值对象是与领域相关的概念。
Vijay Patel 的解释非常完美。
VO
但必须使用单独的表,因为它是VO
的集合。那么在这个例子中,VO
(地址)将具有包含实体的外键,并且在数据库中将具有一个键!这违反了值对象不应该具有身份的原则。 - Anyname Donotcare