gpt4 book ai didi

java - DDD valueObject 和数据库模式

转载 作者:太空宇宙 更新时间:2023-11-04 14:16:08 27 4
gpt4 key购买 nike

在 2014 年结束时,我认为有一个简单的问题。我想更多地使用“DDD”,目前我正在尝试尝试各种用例以了解有关 DDD 的更多信息。

我当前的用例如下:

  • 我们有一个新的数据库架构,它使用我们公司的经典模式:将我们的命名表建模为“id/ code/ label”。我认为这是使用 hibernate 时的一个非常经典的案例。

但在面向对象的世界中,当使用 JDBC 或 QueryDSL 等 API 时,如此简单的事情就会变得“复杂”。我需要通过代码获取对象,检索其 id 或加载完整对象,然后将其设置为另一个对象中的一对一关系。

我想知道:

  • 这种命名法可以是枚举(或具有字符串 cosnatnts 的类,具体取决于开发人员)。用 DDD 术语来说,它是我的 ValueObject
  • 数据库中的 id/code/label 对 i18n 不友好(这不是先决条件),因此我看不到它的优势。除非表可以动态更新并且用例是“在从此表加载的组合框中选择某些内容并与另一个对象建立关系:但这就是因为如果您有必须应用的业务规则,您需要了解新代码”等等)。

我的问题是:

  • 您经常在数据库模型中使用 id/ocde/label 模式吗?
  • 您如何对命名数据进行建模? (国家也许不是最好的例子:)但无论如何,你如何建模它?不假思索地我会说国家的数据库表;但对于某些状态:“有效,等待验证,拒绝”?
  • 您是否使用此模式对 valueObject 进行建模?
  • 或者您是否使用大量枚举并且仅将它们的 toString(或序数)存储在数据库中?

在 Java OO 对象世界中,我目前认为操作从数据库加载的对象的枚举更容易。例如,我需要构建存储库来加载它们。将它们用作枚举将非常简单。我正在这里寻找一些安慰,或者也许我错过了一些如此明显的东西?

谢谢

2015 年见!

更新 1:我们可以创建一个“预算”,第一个预算被标记为“初始”,下一个被标记为“修正”(带有增量)。例如,我们可以有一个预算列表:“初始预算”、“修正预算#1”、“修正预算#2”。

为此,我们有这样的数据库设计:一个预算表,一个版本预算,两者之间有一个外键。版本预算仅包含 ID、CODE 和 LABEL。

就我个人而言,我想删除这个表。我没有看到这种结构的优点。从面向对象的角度来看,当我创建预算时,我可以查询数据库以查看是否需要创建初始预算或修正预算(使用计数查询),然后我可以为新预算设置正确的枚举。但在当前的设计中,我需要使用我想要的 CODE 查询数据库,选择 ID 并设置 ID。所以是的,它确实是面向数据库的。 DDD 部分在哪里? ValueObject 是描述、量化某事物的东西。就我而言,这对我来说似乎很好。版本描述了我的预算的当前状态。我可以比较两个版本,但检查它们的代码,它们没有生命周期(我特别不想要这个)。

如何处理此类用例?

这只是一个简单的例子,因为我发现如果你问数据库管理员,他肯定会说一切看起来都很好:使用主键、建模关系、强制约束、使用外键并避免数据重复。

再次感谢 Mike 和 Doctor 的评论。

最佳答案

我将加入您所在国家/地区的示例。在大多数情况下,国家/地区将是一个值对象。没有任何东西会引用国家实体,并且应该知道如果国家的值(value)观发生变化,它仍然是同一个国家。事实上,该国家/地区可以表示为一个枚举,以及一​​些将 Iso3 转换为有用的显示文本的讨厌的资源查找函数。我们所做的是,我们将其定义为一个带有 iso3、displayname 和一些其他静态信息的值对象类。现在,我们从这个值对象中定义了一种“权力枚举”(我仍然错过了一个标准术语)。实现国家/地区值对象的类获取其每个值(针对每个国家/地区)的私有(private)构造函数和静态属性以及来自和到 int 的显式强制转换运算符。现在您可以像对待编程语言的普通枚举一样对待它。普通枚举除了具有更多属性字段之外的优点是,它还可以具有方法(当然是查询方法,不会更改对象的状态)。您甚至可以使用多态性(某些国家/地区的行为与其他国家/地区不同)。您还可以从数据库表加载枚举的内容(没有静态 then 和静态 LookupByIso3 方法)。

您也可以使用其他一些“类似枚举”的值对象来实现这一点。想象一下货币(它可以具有实现多态的转换方法)。不过,每日汇率的处理是一个不同的话题。

如果值集不固定(例如另一个候选值对象,如邮政地址),那么它不是一个值对象枚举,而是一个可以用您想要的值实例化的标准值对象。

要决定是否可以接受某些东西作为值对象,可以使用以下问题:您想要复制语义还是引用语义?如果您更改了对象的属性,那么您使用它的所有位置是否也应该更新,还是应该保持原样?如果是后者,则“更改”的对象是一个新的且不同的值对象。另一个问题是,如果您需要跟踪对象的更改,并意识到尽管值发生变化,它仍然保持“相同”。如果您有一个值对象,您只希望存在特定实例,那么它就是上面描述的一种枚举。

这对你有帮助吗?

关于java - DDD valueObject 和数据库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27722302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com