数据库实体关系中的域名与数据传输对象(DTO)之间的区别

3
我在数据库中有三个表格,有一条旧的好查询语句,可以使用RowMapper将关联的列映射到DTO对象上,这是经典的Java方法。
但我想知道如何将其转换为DDD实现?如何使用实体来解决问题,而无需使用3个分开的查询来创建具有字段的模型,然后只为创建具有所需列的对象创建DTO?
我缺少什么?或者已经实施的方式更好吗?
1个回答

3

你无法将该模型转换为DDD。

DDD是指在一个单独的层中创建业务模型:领域层。该层的目的是验证任何状态更改操作不违反您的业务规则。如何建模您的领域实体必须由您处理的用例驱动,而不是数据存储方式:领域层被称为“持久性不可知”。无论数据存储在一个或多个存储器、关系数据库管理系统、nosql、文件等中,都没有关系…… 这就是基础架构层的目的。

领域对象由一个名为repository的类读取。该存储库的行为类似于内存中的领域对象集合,但实际上是从持久存储区重新加载对象。它作为持久性模型和领域模型之间的中介。由于模型可能不同,因此存储库可以展平关系、连接来自不同来源的数据并在需要时忽略某些列。

在查询状态时,您根本不需要使用领域层。该层的目的是验证状态更改操作的业务方面,但在查询状态时这是不必要的。在这种情况下,您可以实现名为mediators的类,它将查询您的数据库并生成表示层DTO。与存储库一样,中介器是持久性模型和表示模型之间的适配器。它可以连接来自多个持久性存储区的数据、展平关系并忽略列。

是否使用ORM访问数据库是基础结构层的实现细节。它与领域建模无关,领域建模是关于您的用例和业务规则验证。


因此,总结一下,在这种特定情况下,当我查询数据库以从多个表中的联接关系创建一个复合“对象”并生成单个“对象”时,我必须使用某种适配器,如DTO。不知道是否重要,但我根本不需要表示层。在这种情况下,我必须假设贫血“模型”或“DTO”应该是正确的方式? - Alex Vergara
重要的部分不是在查询状态时使用您的领域模型。读取持久性存储并转换为演示模型。应用程序具有演示模型,否则无法进行交互。该模型可以是XML、HTML、JSON等。然而,最好使用DTO模型作为中间层,以便将数据库查询与“模板化”分离。 - ArwynFr
如果应用程序不与外部交互,但我想要一个坚实清晰的架构怎么办?例如,编写批处理作业的代码时。最好使用DTO查询数据库,因为我需要的实体具有3个不同表的属性(通过连接这些表并选择有趣的列来获取查询结果)。或者我确实必须使用“模型”或实体符号?我的疑问更多地涉及Java命名约定的正确实践。 - Alex Vergara
如果您编写自己的SQL,则可以将数据存储在最适合您的应用程序的内存结构中,并自行进行翻译。如果您将SQL延迟到ORM库,则需要一个与您的数据库架构匹配的DPO模型。选择哪个取决于您编写比考虑中的ORM库更好的SQL代码的能力。 - ArwynFr
听起来很有趣 @ArwynFr。 顺便说一下,这是一个不错的谈话。谢谢你抽出时间。 - Alex Vergara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接