写点什么

在领域驱动设计中对聚合进行设计与存储

  • 2014-12-18
  • 本文字数:995 字

    阅读完需:约 3 分钟

在使用领域驱动设计的过程中,使用者们对于如何创建设计良好的聚合(aggregate)这一模式始终知之甚少。在 Vaughn Vernon 近期发布的两篇文章中,他为读者介绍了组合聚合边界的相关指南,并且介绍了在对聚合进行存储的时候如何使用 ORM 的替代技术

《实现领域驱动设计》( Implementing Domain-Driven Design)一书的作者 Vaughn 为了简化聚合的组合,定义了四条他认为很有帮助的规则:

  • 在一致性边界之内确保不变性,这也暗示着在一个事务中应该只对一个聚合进行变更。
  • 设计尽量小的聚合,尽可能实现一个实体这样的最小聚合。
  • 只通过唯一标识的方式对其它聚合进行引用,意味着不应当存在在某个聚合中直接访问另一个聚合的情况出现。
  • 在一致性边界之外使用最终一致性方式。实现这一点可以使用领域事件进行通知,领域中的其它部分可以在一个新的事务之中对其它聚合进行变更。

Vaughn 强烈建议首先从第二条规则开始实施,让每个实体成为一个聚合根,不存在任何例外的情况。接下来再为该聚合添加所有字段与属性,以使该聚合在创建时保证处于某个有效的状态下。

Vaughn 所建议的下一步骤,是与领域专家进行协同工作,以找中哪些聚合是必须在同一个事务中进行变更的,以及哪些聚合是可以由某些变更进行触发的。Vaughn 在这里提出了一点警告,领域专家都倾向于声明所有实体都是必须在同一个事务中进行变更的,而这种情况其实并不多见,很有可能是由于这些专家之前的工作经验都是与数据库密集型系统打交道所导致的。

Vaughn 一直在寻找某种比对象- 关系/ 映射(ORM)框架更好的方法对聚合进行保存,他曾考虑以 JSON 格式对聚合进行序列化,并将结果保存在某个文档数据库中。在对领域事件进行操作时,这些事件必须在聚合进行变更时保存在同一个事务中,否则一旦存储机制出错,整个系统的数据就有可能产生不不一致。但使用文档数据库的一个问题在于,多数文档数据库都不支持 ACID 的事务功能,对于那些无法接受不一致的系统来说,这实际上就断绝了使用文档数据库的可能性。因此 Vaughn 转而寻找某种支持事务与 JSON 的数据存储系统,目前他所找到的一个产品是 PostgreSQL 9.4 的 beta 版本,他已在一些小型示例中成功地应用它作为聚合的存储机制了。

Vaughn 还撰写了关于《高效聚合设计》的一系列共三篇文章。

在早些时候, Julie Lerman 也在文章中介绍了如何在边界上下文之间共享数据的话题。

查看英文原文: Designing and Storing Aggregates in Domain-Driven Design

2014-12-18 04:223483
用户头像

发布了 428 篇内容, 共 199.0 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

为什么亚马逊轻量级服务器这么受欢迎

在下小吉.

服务器 轻量级服务器 亚马逊

上海站报名启动! 2023年开源产业生态大会OpenHarmony生态分论坛

OpenHarmony开发者

OpenHarmony

全面预算管理,帮助企业财务团队冲破市场挑战

智达方通

全面预算管理 财务团队

详解CCE服务:一站式告警配置和云原生日志视图

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟 华为云CCE容器服

平台工程指南:TheNewStack 发布的免费电子书

杨振涛

HashiCorp 平台工程 平台工程社区 PECommunity Platform Engineering

2023年微软开源八个人工智能项目

树上有只程序猿

人工智能 微软 开源

HarmonyOS设备管理开发:USB服务开发指导

HarmonyOS开发者

HarmonyOS

首个“全4K”运动会,上云!

天翼云开发者社区

云计算 大数据 云服务

数字先锋| 雪域高原一朵“云”,天翼云助力青海打造省级融媒云平台

天翼云开发者社区

云计算 大数据 5G

数字先锋| “翼”键上云,开启智慧医疗新时代!

天翼云开发者社区

人工智能 云计算 大数据

【论文解读】在上下文中学习创建任务向量

合合技术团队

人工智能 LLM ICL

免费获取GPT-4的五种工具

互联网工科生

人工智能 GPT-4

教你如何防止数据被异常篡改,并复原数据

秃头小帅oi

程序员 前端 低代码 数据异常

浪潮云洲基于QID技术的"师旷"前装固件成功首发

财见

Web3钱包开发:解锁未来投资利润丰厚的机会

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

列举数据库缓存使用场景实例和命令速查表

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟

在领域驱动设计中对聚合进行设计与存储_语言 & 开发_Jan Stenberg_InfoQ精选文章