写点什么

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

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

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

关注

评论

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

DAYU200关闭自动息屏的几种方式

坚果

OpenHarmony 三周年连更

Java线程中的wait、notify和notifyAll解析

共饮一杯无

Java 多线程 三周年连更

灵活应用Nginx Map:实战经验与实用方法

小毛驴的烂笔头

nginx linux运维 Nginx实践

一文读懂 Spring Bean 的生命周期

老周聊架构

三周年连更

项目讲解之常见安全漏洞

越长大越悲伤

Java Web 安全

热爱所有热爱

闫同学

三周年连更

开源趣事~记给OpenHarmony提PR的那些事

Bob

开源 Open Harmony

文心一言 VS chatgpt (11)-- 算法导论2.3 7题 3.1 4~5题

福大大架构师每日一题

福大大 ChatGPT 文心一言

华为云:网络安全愈发重要,企业该如何保障自身业务安全?

YG科技

SAP Emarsys 和 SAP Spartacus 的集成

汪子熙

SAP Spartacus 思爱普 三周年连更 Emarsys

动态资源技术JSP|Java与Html的美好相遇

浅羽技术

Java html 服务端 jsp 三周年连更

华为云网站安全解决方案助力客户——构建风险全面可控的网站安全架构

YG科技

跨平台应用开发进阶(五十)uni-app ios web-view嵌套H5项目白屏问题分析及解决

No Silver Bullet

uni-app ios 跨平台应用开发 三周年连更 web-view

尚能饭否|技术越来越新,我对老朋友jQuery还是一如既往热爱

浅羽技术

jquery 前端 Web 框架 三周年连更

全栈开发实战|Spring Boot文件上传与下载

TiAmo

Spring Boot 三周年连更 Apache Commons 文件上传下载

IT分享丨我是如何利用华为云网站安全解决方案帮助中小型企业实现IT安全

YG科技

灵活应用Nginx Rewrite:实战经验与实用方法

小毛驴的烂笔头

nginx linux运维

Django笔记十之values_list指定字段取值及distinct去重处理

Hunter熊

Python django distinct values

在Mac上快速体验AI作画

IT蜗壳-Tango

三周年连更

华为云网站安全解决方案:全面保障企业网络安全,助力业务稳定高效运行

YG科技

Spring Boot整合多数据源实践

Java Spring Boot

Springboot如何手动连接库并获取指定表结构|超级详细,建议收藏

bug菌

springboot 三周年连更

2023-04-18:ffmpeg中的hw_decode.c的功能是通过使用显卡硬件加速器(如 NVIDIA CUDA、Intel Quick Sync Video 等)对视频进行解码,从而提高解码效

福大大架构师每日一题

golang 音视频 ffmpeg 福大大

华为云网站安全解决方案:守护企业数字化转型之路,提升业务效率与安全

YG科技

数据库、

IPv6域名软件

穿过生命散发芬芳

ipv6 三周年连更

“程序员”未来会失业吗 | 社区征文

BROKEN

三周年征文

华为云网站安全解决方案:守护您的网站,让安全无忧

YG科技

华为云网站安全解决方案:中小型企业的云上云下安全守护专家

YG科技

使用 docker manifest 构建跨平台镜像

江湖十年

Docker Desktop docker image docker build Docker 镜像

中小企业如何保障网络安全?用了这么多项目华为云其实还不错!

YG科技

基于阿里云物联网平台设计的实时图传系统_采用MQTT协议传输图像

DS小龙哥

三周年连更

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