写点什么

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

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

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

关注

评论

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

从ClickHouse通往MySQL的几条道路 | 京东物流技术团队

京东科技开发者

MySQL 数据库 Clickhouse

OmniPlan Pro 4 for Mac:专业的项目管理规划工具

Rose

OmniPlan Pro 4 OmniPlan Pro许可证 Mac项目管理软件 OmniPlan Pro Mac中文版 OmniPlan Pro注册码

DM同步为已有迁移任务增加新同步的表

TiDB 社区干货传送门

迁移 实践案例 管理与运维

万界星空科技MES系统中的生产管理流程

万界星空科技

生产管理系统 mes 制造业生产管理系统 云mes 万界星空科技mes

解密 ArcGraph 分布式一致性:Raft 协议与分布式事务实现丨技术专栏

Fabarta

分布式事务 分布式系统 raft协议 分布式图数据库

推荐5款很牛的Paas平台编译构建工具

伤感汤姆布利柏

Linus:我休假的时候也会带着电脑,否则会感觉很无聊

极狐GitLab

Linux 开源 AI DevOps gitlab

苹果Mac电脑:2023年度mac app | Pixelmator Pro 图像编辑修图

Rose

Pixelmator Pro Mac修图软件 Pixelmator Pro破解 苹果软件下载

在线教育小程序正在成为教育行业的技术强兵

Onegun

小程序 在线教育 在线学习 小程序化

领先实践之鑫阳钢铁∣短流程钢铁企业废钢智能判级的行业标杆

用友BIP

废钢智能判级

文心ERNIE Bot SDK+LangChain:基于文档、网页的个性化问答系统

飞桨PaddlePaddle

人工智能 开发者 开发工具

通俗解释一下“强静态类型”

伤感汤姆布利柏

Pipeline模式应用 | 京东云技术团队

京东科技开发者

pipeline 流程编排 管道模式

Gestimer for Mac:轻量定时器,提醒大小事

Rose

Gestimer Mac中文版 Gestimer破解版 Gestimer下载 Mac任务提醒工具

实战干货!基于ERNIE Bot SDK的数字诗人聊天开发教程

飞桨PaddlePaddle

人工智能 数字人 技术干货 文心一言

语言模型:GPT与HuggingFace的应用

华为云开发者联盟

人工智能 华为云 GPT 华为云开发者联盟

在线教育小程序如何一键生成App

Onegun

在线教育 小程序转app

3D LED广告牌市场潜力待挖掘

Dylan

视频 图片 文字 LED LED显示屏

五金家具行业MES解决方案

万界星空科技

mes 制造业生产管理系统 万界星空科技mes 家居设计工具 家具生产管理系统

CurveFS 助力网易云商,解决语音识别训练数据增长需求

OpenCurve

云计算 开源 文件存储 分布式文件存储 海量数据

如何用Excel进行数据分析?Excel分析数据功能教程分享

Rose

Excel使用教程 Excel 数据分析 Excel 下载

使用TiKV-CDC实现rawkv集群的两地三中心

TiDB 社区干货传送门

实践案例 集群管理 数据库架构选型 数据库架构设计 6.x 实践

TiDB知识点梳理 (PCTA 笔记分享)

TiDB 社区干货传送门

TiDB 底层架构 TiDB 源码解读

强强联合!航天科技AIRIOT助力航天电工打造智慧工厂

AIRIOT

IOT Platform 智慧工厂

ACPM高效C++组件管理让音视频终端SDK性能更好、稳定性更高

阿里云CloudImagine

云计算 视频云

苹果电脑FTP客户端:Transmit for mac 中文版 支持M/intel

Rose

Mac 软件 Transmit 5 Transmit破解版 FTP客户端

为什么要对数据库优化

小魏写代码

详细了解大数据离在线混部架构模型

易程

大数据 Kubernetes 云原生大数据 离在线混部 大数据离在线混部

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