一个被多次使用的Value对象是一个实体吗



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

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

当我定义我的模型时,我假设Person是一个实体,但Address是一个Value对象,因为如果您更改Address的单个属性,那么它就不再是同一个Address了。

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

多次使用的Value Object是实体吗?

没有,但这取决于。。。

通常情况下,值对象实际上是实体的代理标识符,而您可能在模型中没有明确意识到这一点。

例如:

1600 Pennsylvania Ave NW
Washington, DC 
20500

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

  • 街道的名称
  • 城市的名称

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

使事情进一步复杂化——您需要为您的模型提供合适的抽象。

考虑资金:

{USD:100}

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

{USD:100, SerialNumber:KB46279860I}

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

您还需要小心重合特性。例如街道的名字变了——地址的值应该变吗?如果模型关心一个位置的当前标识符,那么也许它应该关心。如果模型正在跟踪你两个月前放在信封上的信息,那么它当然不应该。(换句话说,当我们更改街道实体的标签时,已经打印在信封实体上的标签没有更改)。

这是一个重要的问题,但答案会随着你当时建模的内容而变化。

在我的模型中,我有一个Person,它有一个Address。然而,许多个人可以共享同一地址。

这个人有一个address_id字段,与地址表?如果是这样,那么地址就是一个实体,对吗?

您必须认识到有两个不同的模型,一个领域模型和一个持久性模型,两者可能在概念是实体还是价值上不一致。

你要做的第一件事是从域的角度问自己什么是地址?您的域对地址的生命周期感兴趣吗?还是它们只是不可变的值?例如,如果地址中有拼写错误,会发生什么?你是简单地丢弃不正确的地址并替换它,还是修改原始地址详细信息以跟踪它的连续性?这些问题将帮助您从域的角度确定地址是实体还是值。

现在,一个概念可能是域中的一个值,同时又是持久性模型中的实体。例如,假设您对域中地址的生命周期不感兴趣,但非常关心优化存储空间。在这种情况下,您可以为数据库中的唯一地址提供标识符,并将其用于关系,而不是多次复制相同的地址详细信息。

然而,这样做会在你的模型之间引入额外的紧张关系,所以你必须确保这样做有真正的好处

相关内容

  • 没有找到相关文章

最新更新