2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

  • 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:223472
用户头像

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

关注

评论

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

oeasy 教您玩转linux 010303文件管理器 nautilus

o

早知道这 8 个锦囊,我的程序人生一定更精彩

沉默王二

程序员

架构师训练营第一周总结

万里

极客大学架构师训练营

# 架构师训练营Week1总结

lggl

极客大学架构师训练营 UML

week-1-part2 学习总结

陈龙

第一周:学习总结

王建军

git 常用操作及 git 工作流介绍

hepingfly【gzh:和平本记】

git git分支操作 git工作流

极客时间架构 1 期:第 1 周架构方法 - 命题作业

Null

课程大作业

小胖子

第1周 作业

wgl

UML

【架构师训练营1期】第一周作业

诺乐

深入理解JVM垃圾回收算法 - 标记清理算法

Skye

GC算法 标记清理 位图标记 懒惰标记

架构师第一周

Geek_Gu

极客大学架构师训练营

架构师第一周笔记

Geek_Gu

第1周 作业

Pyr0man1ac

SpringBoot系列(1)-初识SpringBoot

引花眠

学习 springboot

ARTS打卡 第17周

引花眠

微服务 ARTS 打卡计划

第二周 - 框架设计

Arthur云剑

week1 架构方法总结

zero2onemore

架构师训练营第一周课程笔记及心得

Airs

架构师训练营第 1 期第一次作业

Geek_a01290

极客大学架构师训练营

腾讯PCG数据中台专场介绍&招聘报名

Geek_c46970

数据中台 腾讯 招聘

高效程序员的45个习惯:敏捷开发修炼之道(8)

石云升

敏捷开发 技术分享 轮换制

第一周命题作业

王建军

信任环:口碑传播的关键环节

boshi

用户增长 运营创新

java安全编码指南之:输入校验

程序那些事

java安全编码 安全编码规范 java安全编码指南

我搭建了一套企业级私有Git服务,抗住了每天上万次攻击!

冰河

git 代码管理 代码仓库 私有服务 远程协作

架构师训练营第 1 期第一周总结

Geek_a01290

极客大学架构师训练营

Java新特性:数据类型可以扔掉了?

王磊

Java 新特性 Java新特性 var 局部类型推导

程序员为什么热衷于造轮子,升职加薪吗?

小傅哥

Java 小傅哥 代码质量 编程开发 编程经验

超全面分布式缓存高可用方案:哨兵机制

架构精进之路

redis哨兵模式

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