标题中的问题可能不太清楚,让我解释一下:
在我的模型中,我有一个人,有一个地址。但是,许多人可以共享相同的地址。
当我定义我的模型时,我假设Person是一个实体,但是地址是一个Value-Object,因为如果你改变了Address的一个属性,那么它就不再是相同的地址了。
由于多个人可以共享一个地址,如果我直接进入数据库实现,并天真地假设该人有一些address_xxxx字段,它不会在数据库中生成太多重复项吗?那个人有一个与地址表有关的address_id字段不是更好吗?如果是这样,那么地址是实体权利吗?
答案 0 :(得分:5)
是一个多次使用实体的值对象吗?
不,但这取决于......
通常情况下,值对象实际上是实体的代理标识符,您可能没有在模型中明确实现。
例如:
1600 Pennsylvania Ave NW
Washington, DC
20500
如果仔细观察,你会看到嵌入其中
如果这些是模型中对街道/城市实体的引用,那么"地址"是某个实体当前状态的代表(例如:"白宫")。
进一步复杂化 - 您需要适合您模型的抽象。
考虑金钱:
{USD:100}
这是一种价值类型,我们可以用"不同的"替换任何USD:100。 USD:100
{USD:100, SerialNumber:KB46279860I}
这仍然是一个价值(它的状态),但它是流通(某处)存在的特定法案的状态。我们这里有一个信息资源,它描述了现实世界中某个实体。
您还需要注意重合属性。例如;街道名称的变化 - 地址的价值是否会发生变化?如果模型关心某个位置的当前标识符,那么也许它应该。如果模型跟踪两个月前你在信封上放的信息,那肯定不应该。 (换句话说,当我们更改街道实体的标签时,已经打印在信封实体上的标签没有改变)。
这是一个重要的问题,但答案会根据您当时的建模情况而变化。
答案 1 :(得分:3)
在我的模型中,我有一个人,有一个地址。但是很多 人员可以共享相同的地址。
这个人有一个与a相关的address_id字段,这不是更好吗? 地址表?如果是这样,那么地址是实体权利吗?
你必须认识到有两个不同的模型,一个域模型和一个持久性模型,两者可能不同意概念是实体还是价值。
您要做的第一件事就是从域角度问自己什么是地址?您的域名是否对地址的生命周期感兴趣,或者它们只是不可变的值?例如,如果地址中有拼写错误会怎样?您只是丢弃不正确的并替换它,还是宁愿修改原始地址详细信息以跟踪它的连续性?这些问题将帮助您从域角度确定地址是实体还是值。
现在,概念可以是域中的值,同时作为持久性模型中的实体。例如,让我们说您对域中地址的生命周期不感兴趣,但您非常关心优化存储空间。在这种情况下,您可以为数据库中的唯一地址指定标识符,并将其用于关系,而不是多次复制相同的地址详细信息。
然而,这样做会在您的模型之间引入额外的紧张关系,因此您必须确保这样做有实际好处。