阿里云飞天发布时刻,领先大模型限免,超7000万 tokens免费体验 了解详情
写点什么

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

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

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

关注

评论

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

HarmonyOS的功能及场景应用

芯动大师

Python从基础到进阶字符串验证

申公豹

Python

Seaborn 数据可视化全攻略:从基础到高级实战

申公豹

Python

手把手教你Python圣诞主题绘图

申公豹

Python

WorkPlus打造企业即时通讯平台,助力高效沟通与协作

BeeWorks

利用开源框架BMF实现高效视频处理

Geek-yan

鸿蒙 API 9工程转换为API 10工程

坚果

HarmonyOS OpenHarmony

Python文件操作指南:读写、异常处理与上下文管理器详解

申公豹

Python

cmake | AI工程化部署

AIWeker

c AI AI工程化部署

构建高效、安全的在线考试系统:基于Spring Boot和Vue的前后端分离之道

申公豹

WorkPlus超级APP助力企业节省IT人力成本,实现快速移动化

BeeWorks

CnosDB:深入了解时序数据处理函数

CnosDB

开源 时序数据库 CnosDB

简洁灵活:Python中基于字段的不使用元类的ORM实现

申公豹

Python

嵌入式系统中的低功耗定时器应用与优化实战

申公豹

嵌入式

KubeWharf适合场景 开源赛道 3:深入云原生

Echo_Wish

云原生 年度总结 2023 KubeWharf 技术总结

用纯 Python 打造的轻量级 Excel 到 Markdown 转换工具

申公豹

Python

Python图像处理:批量添加水印的优雅实现与进阶技巧

申公豹

Python

多表格文件单元格平均值计算实例解析

申公豹

Python

深入探索嵌入式系统开发:从LED控制到物联网集成

申公豹

嵌入式

嵌入式系统入门实战:探索基本概念和应用领域

申公豹

嵌入式

项目分享:AIGC技术在智能教学生成中的应用

YoLo

AI

实时任务调度与通信协议在嵌入式开发中的应用

申公豹

嵌入式

CnosDB如何确保多步操作的最终一致性?

CnosDB

开源 时序数据库 CnosDB

掌握进阶:高级功能、图表定制与地理数据绘制

申公豹

Python

基于STM32的物联网节点设计与实现-传感器数据采集与无线通信

申公豹

嵌入式

WorkPlus一站式协同解决方案,助力企业降本增效

BeeWorks

深入学习Python与Vscode环境的安装与配置

申公豹

Python

在Python中实现条形图动态追赶动画效果

申公豹

Python

基于Vue.js和Spring Boot的口罩自助售卖系统:设计、实现与技术深度解析

申公豹

开发

深入理解嵌入式系统中的GPIO控制与应用

申公豹

嵌入式

个人技术成长方面的心得体会:边缘计算之旅

农夫三拳

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