值对象如何存储在数据库中?

Posted

技术标签:

【中文标题】值对象如何存储在数据库中?【英文标题】:How are Value Objects stored in the database? 【发布时间】:2010-10-15 07:22:13 【问题描述】:

我还没有真正看到任何示例,但我假设它们保存在数据库的包含实体表中。

即。如果我有一个 Person 实体/聚合根和一个对应的 Person 表,如果它有一个名为 Address 的值对象,那么 Address 值将保存在这个 Person 表中!

这对于我拥有其他实体(例如公司等)的域是否有意义?

(我目前正在编写一个项目管理应用程序并试图进入 DDD)

【问题讨论】:

【参考方案1】:

出于您所描述的原因,可以将值对象存储在单独的表中。但是,我认为您误解了实体与 VO - 这不是与持久性相关的问题。

这是一个例子:

假设 CompanyPerson 都有相同的邮件 Address。以下哪些陈述认为有效?

    "如果我修改 Company.Address,我想要 Person.Address 自动获取 这些变化” "如果我修改 Company.Address,它 不得影响 Person.Address”

如果1为真,Address应该是一个Entity,因此有它自己的表 p>

如果 2 为真,则 Address 应该是一个值对象。它可以作为组件存储在父实体的表中,也可以拥有自己的表(更好的数据库规范化)。

如您所见,Address 的持久化方式与 Entity/VO 语义无关。

【讨论】:

请问我们是否坚持使用VO 的第二种情况,但我们必须使用单独的表,因为它是VO 的集合。那么这个例子中的VO(地址)将有一个来自包含实体的外键,并将在数据库中有一个键!这违反了值对象不应该有身份。 太好了,非常感谢。但是如果我们忘记了“DB”,我能问一下是什么让 VO 的集合不同于作为实现的实体(当我设计域时)。我必须为这个集合创建一个类,它有一个键和实体的 id。? @AnynameDonotcare 不要考虑表的实体/值,.. 您可以将具有所有值对象的实体存储为 MongoDB 中的单个文档,或存储为 XML 中具有子节点的单个节点,或作为 JSON 对象,.. 不要将逻辑和域模型与技术表示耦合 @Vijay 你有一个关于如何实现这个的实际例子吗?考虑到表最终需要原语来存储,将地址视为非表有点令人困惑。您的意思是在存储库中,我们应该对值对象进行编码/解码并相应地持久化吗? @AnynameDonotcare 是的,但是地址将在表中有键,但在域逻辑中没有。我认为重要的是他们在域逻辑中没有身份。正如 kravemir 所说,数据库是一个技术细节。【参考方案2】:

大多数开发人员倾向于先考虑数据库,然后再考虑其他任何事情。 DDD 不知道如何处理持久性。这取决于存储库来处理它。您可以将其保存为 xml、sql、文本文件等。实体/聚合/值对象是与域相关的概念。

Vijay Patel 的解释非常完美。

【讨论】:

以上是关于值对象如何存储在数据库中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将对象中特定键的值存储到数组中 - Vue

如何将表单值存储在 data() 对象中?

如何存储多个数据类型的数组

如何在 Python Pandas 中扩展存储为单个值的可迭代对象? (又名反向分组)[重复]

您如何混合 SQL DB 与键值存储(即 Redis)

redis存储的键值最好控制在多少kb内