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

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

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

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

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

【问题讨论】:

    标签: domain-driven-design value-objects


    【解决方案1】:

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

    这是一个例子:

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

    1. "如果我修改 Company.Address,我想要 Person.Address 自动获取 这些变化”
    2. "如果我修改 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 的解释非常完美。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2022-11-17
      • 2011-10-22
      • 2013-01-10
      • 2013-05-12
      • 2013-02-07
      相关资源
      最近更新 更多