写点什么

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

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

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

关注

评论

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

strcat() - 连接字符串

謓泽

7月月更

短视频直播系统源码

开源直播系统源码

短视频源码 直播系统源码 开源源码

在 Business Application Studio 里使用 SAP UI5 应用消费 OData 的 Create 和 Delete 操作

汪子熙

Cloud SAP Fiori SAP UI5 7月月更

Android 功能开发笔记

沃德

android 程序员 7月月更

后深度学习时代,推荐系统向何处去?

博文视点Broadview

云原生(八) | Devops篇之深入Devops

Lansonli

云原生 7月月更

C++课程设计:图书管理系统【附源码】

攻城狮杰森

c++ 7月月更 课程设计 图书管理系统

Qt | QWidget的一些总结

YOLO.

qt 7月月更

Wallys/DR882/QCA9882/ AC/AN MiniPCIE/2×2.4GHz 2x5GHz MT7915 MT7975

wallys-wifi6

QCA9880 QCA9882 MT7915 MT7975 /

mysql进阶(十三)命令行导出导入数据库

No Silver Bullet

MySQL 数据库 数据导入 数据导出 7月月更

Unity3D和Android交互

沃德

程序员 Unity 7月月更

java零基础入门-java8新特性(下篇)

喵手

Java 7月月更

【LeetCode】数位和相等数对的最大和Java题解

Albert

LeetCode 7月月更

小心!正则 test() 匹配的一个“坑”

掘金安东尼

正则 7月月更

LeetCode-100. 相同的树(java)

bug菌

Leet Code 7月月更

图的基本定义和相关概念(一)

乔乔

7月月更

数仓之数据质量建设

五分钟学大数据

数据仓库 数据治理 数据质量 7月月更

KUDU1.11 环境安装

怀瑾握瑜的嘉与嘉

7月月更 kudu

让你事半功倍的JS utils工具函数

南城FE

JavaScript 前端 工具库 7月月更

Wallys/3×3/2×2 MIMO/ 802.11ac/ Mini PCIe /2,4GHz / 5GHz QCA 9880

wallys-wifi6

用 emoji 学安全上网小常识?看 Google 新玩法

Geek_2d6073

Spring系列一:Spring基础篇

叶秋学长

算力网络,AI先行,昇腾AI助力运营商数字化转型 ——携手聚力,共赢算力时代

科技热闻

被大厂强制毕业,两个月空窗期死背八股文,幸好上岸,不然房贷都还不上了

程序知音

Java 程序员 java面试 后端技术 八股文

在 Excel 内使用 ODBC 消费 SAP ABAP CDS view

汪子熙

JDBC SAP abap ODBC 7月月更

解密方舟的高性能内存回收技术——HPP GC

HarmonyOS开发者

HarmonyOS

C# DataGridView数据导出Excel文件

IC00

C# 7月月更

亮点抢先看!2022 开放原子全球开源峰会定于 7 月 25-29 日在北京举办

kk-OSC

开源 开发原子全球开源峰会

STM32+DHT11读取温湿度数据显示

DS小龙哥

7月月更

视频分析StreamEye Studio

贾献华

7月月更

出自阿里P8的Java面试神册,涵盖30个技术栈扛住面试官的狂轰乱炸

程序知音

Java 面试 程序员面试 后端技术 Java八股文

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