是一个多次使用实体的值对象?

Luc*_*cio 3 database domain-driven-design value-objects

标题中的问题可能不太清楚,让我解释一下:

在我的模型中,我有一个Person,它有一个Address.但是,许多人可以共享相同的地址.

当我定义我的模型时,我假设Person是一个实体,但是如果你改变了Address的一个属性,那么就是一个Value-Object,那么它就不再是同一个地址了.

由于多个人可以共享一个地址,如果我直接进入数据库实现,并天真地假设该人有一些address_xxxx字段,它不会在数据库中生成太多的重复项吗?那个人有一个与地址表相关的address_id字段不是更好吗?如果是这样,那么地址是实体权利吗?

Voi*_*son 5

是一个多次使用实体的值对象?

不,但这取决于......

通常情况下,值对象实际上是实体的代理标识符,您可能没有在模型中明确实现.

例如:

1600 Pennsylvania Ave NW
Washington, DC 
20500
Run Code Online (Sandbox Code Playgroud)

如果仔细观察,你会看到它嵌入其中

  • 街道的名称
  • 一个城市的名字

如果这些是对模型中街道/城市实体的引用,那么"地址"是某个实体当前状态的表示(例如:"白宫").

使事情进一步复杂化 - 您需要适合您的模型的抽象.

考虑钱:

{USD:100}
Run Code Online (Sandbox Code Playgroud)

这是一种价值类型,我们可以用"不同"美元:100替换任何USD:100

{USD:100, SerialNumber:KB46279860I}
Run Code Online (Sandbox Code Playgroud)

这仍然是一个价值(它的状态),但它是一个特定法案的状态,存在于流通中(某处).我们这里有一个信息资源,它描述了现实世界中某个实体.

您还需要注意重合属性.例如; 街道名称的变化 - 地址的价值是否会发生变化?如果模型关心位置的当前标识符,则可能应该如此.如果模型跟踪两个月前你放在信封上的信息,那肯定不应该.(换句话说,当我们更改街道实体的标签时,已打印在信封实体上的标签没有改变).

这是一个重要的问题,但答案会根据您当时的建模情况而变化.