写点什么

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

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

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

关注

评论

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

Flutter混合开发(三):Android与Flutter之间通信详细指南

android 程序员 移动开发

用技术变革传统康养行业,智慧养老的正确打开方式

华为云开发者联盟

IoT 华为云 康养 智慧养老 智慧康养物联网加速器

Glide源码难看懂?用这个角度让你事半功倍!,移动端h5页面加载慢

android 程序员 移动开发

模块二作业

@

HarmonyOS-Service&Android-Service,android开发零基础教学

android 程序员 移动开发

Flutter的原理及美团的实践(中),直击优秀开源框架灵魂

android 程序员 移动开发

Flutter自适应瀑布流,深入浅出安卓开发

android 程序员 移动开发

Flutter这么火为什么不了解一下呢?(下,2020-2021京东Android面试真题解析

android 程序员 移动开发

GitHub标星8-3k的学习习惯,未来的Android高级架构师:别让这几个点毁了你

android 程序员 移动开发

GitHub标星9,handler机制

android 程序员 移动开发

HMS Core 5,Android开发教程

android 程序员 移动开发

Fragment新功能,setMaxLifecycle了解一下,一文详解

android 程序员 移动开发

HarmonyOS-Service&Android-Service(1),程序员中年危机

android 程序员 移动开发

Google又更新了:实战-MergeAdapter,hashmap底层原理

android 程序员 移动开发

IGG:Android内存回收机制原理是什么,flutterlistview滚动卡顿

android 程序员 移动开发

Gradle 提速:每天为你省下一杯喝咖啡的时间,移动app开发公司

android 程序员 移动开发

Handler-post和View-post的区别,android的开发语言

android 程序员 移动开发

GitHub标星5-3K【字节跳动大牛】手把手讲解-Android-Hook入门Demo

android 程序员 移动开发

Glide加载Gif的卡顿优化思路分析,android开发项目实例记事本

android 程序员 移动开发

pygame 读取一大堆图片进来,再获取一张图片上的那么一小块区域

梦想橡皮擦

11月日更

Flutter提升开发效率的一些方法和工具,零基础入门学习android

android 程序员 移动开发

Framework掌握不熟?字节跳动大牛带你系统化学习,成功定级腾讯T3-2

android 程序员 移动开发

HashMap 源码解析一、构造函数,kotlin插件

android 程序员 移动开发

IOC架构设计之控制反转和依赖注入(一),原理讲解

android 程序员 移动开发

Gradle指南之从Groovy迁移到Kotlin,2021国内知名大厂Android岗面经

android 程序员 移动开发

Fragment的使用,为什么有人说Android开发不再吃香

android 程序员 移动开发

Fragment的通信,flutter通知推送

android 程序员 移动开发

Google 为什么以 Flutter 作为原生突破口,正式加入阿里巴巴

android 程序员 移动开发

GooglePlay强推的Appbundle究竟是什么?aab?不优化代码直接减少安装包大小(1)

android 程序员 移动开发

Google大佬自述:天才程序员竟也有不为人知的秘密,看完真的学到了

android 程序员 移动开发

Gradle 庖丁解牛(构建生命周期核心委托对象创建源码浅析)

android 程序员 移动开发

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