多次使用的值对象是实体吗?
Is a Value Object that is used many times an entity?
题中的问题可能不是很清楚,我来解释一下:
在我的模型中,我有一个人,它有一个地址。但是,许多人可以共享同一个地址。
当我定义我的模型时,我假设 Person 是一个实体,但是 Address 是一个值对象,因为如果您更改地址的单个 属性,那么它就不再是同一个地址了。
由于多个人可以共享一个地址,如果我直接进入数据库实现,并天真地假设这个人有一些 address_xxxx 字段,它不会在数据库中生成太多重复项吗? person 有一个与地址 table 相关的 address_id 字段不是更好吗?如果是这样,那么地址是实体吗?
Is a Value Object that is used many times an entity?
不,但这取决于...
通常情况下,值对象实际上是实体的代理标识符,您可能没有在模型中明确意识到这一点。
例如:
1600 Pennsylvania Ave NW
Washington, DC
20500
如果你仔细看,你会看到嵌入其中
- 一条街道的名称
- 城市名称
如果这些是对模型中 street/city 实体 的引用,则 "address" 表示某个实体的当前状态(例如: "The White House").
使事情进一步复杂化 - 您需要为您的模型提供合适的抽象。
考虑金钱:
{USD:100}
这是一个值类型,我们可以用 "different" USD:100
替换任何 USD:100
{USD:100, SerialNumber:KB46279860I}
这仍然是一个值(它的状态),但它是流通中(某处)存在的特定票据的状态。我们这里有一个 信息资源 ,它描述了现实世界中某个地方的实体。
您还需要注意重合属性。例如;街道名称发生变化——address 的值应该改变吗?如果模型关心位置的当前标识符,那么它也许应该关心。如果模型正在跟踪您两个月前放在信封上的信息,那么它肯定不应该。 (换句话说,当我们更改街道实体的标签时,已经打印在信封实体上的标签并没有改变)。
这是一个重要的问题,但答案会根据您当时建模的内容而有所不同。
In my model, I have an Person, that has an Address. However, many
Persons can share the same Address.
Isn't it better that person has an address_id field, related to an
address table ? If so, then Address is an Entity right?
您必须认识到有两种截然不同的模型,域模型和持久性模型,并且两者可能不同意概念是实体还是值。
您要做的第一件事是问问自己,从域的角度来看什么是地址?您的域是否对地址的生命周期感兴趣,或者它们只是不可变的值?例如,如果地址中有拼写错误会怎样?您是简单地丢弃不正确的地址并替换它,还是宁愿修改原始地址详细信息以跟踪其连续性?这些问题将帮助您从域的角度确定地址是实体还是值。
现在,一个概念在域中可能是一个值,而在持久性模型中是一个实体。例如,假设您对域中地址的生命周期不感兴趣,但您非常关心优化存储 space。在这种情况下,您可以为数据库中的唯一地址提供标识符并将其用于关系,而不是多次复制相同的地址详细信息。
但是,这样做会在您的模型之间引入额外的紧张关系,因此您必须确保这样做确实有好处。
题中的问题可能不是很清楚,我来解释一下:
在我的模型中,我有一个人,它有一个地址。但是,许多人可以共享同一个地址。
当我定义我的模型时,我假设 Person 是一个实体,但是 Address 是一个值对象,因为如果您更改地址的单个 属性,那么它就不再是同一个地址了。
由于多个人可以共享一个地址,如果我直接进入数据库实现,并天真地假设这个人有一些 address_xxxx 字段,它不会在数据库中生成太多重复项吗? person 有一个与地址 table 相关的 address_id 字段不是更好吗?如果是这样,那么地址是实体吗?
Is a Value Object that is used many times an entity?
不,但这取决于...
通常情况下,值对象实际上是实体的代理标识符,您可能没有在模型中明确意识到这一点。
例如:
1600 Pennsylvania Ave NW
Washington, DC
20500
如果你仔细看,你会看到嵌入其中
- 一条街道的名称
- 城市名称
如果这些是对模型中 street/city 实体 的引用,则 "address" 表示某个实体的当前状态(例如: "The White House").
使事情进一步复杂化 - 您需要为您的模型提供合适的抽象。
考虑金钱:
{USD:100}
这是一个值类型,我们可以用 "different" USD:100
替换任何 USD:100{USD:100, SerialNumber:KB46279860I}
这仍然是一个值(它的状态),但它是流通中(某处)存在的特定票据的状态。我们这里有一个 信息资源 ,它描述了现实世界中某个地方的实体。
您还需要注意重合属性。例如;街道名称发生变化——address 的值应该改变吗?如果模型关心位置的当前标识符,那么它也许应该关心。如果模型正在跟踪您两个月前放在信封上的信息,那么它肯定不应该。 (换句话说,当我们更改街道实体的标签时,已经打印在信封实体上的标签并没有改变)。
这是一个重要的问题,但答案会根据您当时建模的内容而有所不同。
In my model, I have an Person, that has an Address. However, many Persons can share the same Address.
Isn't it better that person has an address_id field, related to an address table ? If so, then Address is an Entity right?
您必须认识到有两种截然不同的模型,域模型和持久性模型,并且两者可能不同意概念是实体还是值。
您要做的第一件事是问问自己,从域的角度来看什么是地址?您的域是否对地址的生命周期感兴趣,或者它们只是不可变的值?例如,如果地址中有拼写错误会怎样?您是简单地丢弃不正确的地址并替换它,还是宁愿修改原始地址详细信息以跟踪其连续性?这些问题将帮助您从域的角度确定地址是实体还是值。
现在,一个概念在域中可能是一个值,而在持久性模型中是一个实体。例如,假设您对域中地址的生命周期不感兴趣,但您非常关心优化存储 space。在这种情况下,您可以为数据库中的唯一地址提供标识符并将其用于关系,而不是多次复制相同的地址详细信息。
但是,这样做会在您的模型之间引入额外的紧张关系,因此您必须确保这样做确实有好处。