10 月 23 - 25 日,QCon 上海站即将召开,现在大会已开始正式报名,可以享受 8 折优惠 了解详情
写点什么

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

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

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

关注

评论

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

[C语言]支持IPv6的地址查询的函数getaddrinfo()——实践类

阿里云AIoT

人工智能 网络协议 C语言

全球律师事务所 Ogletree Deakins 借助 F5 云服务快速实现远程办公

F5 Inc

云计算 远程办公 云服务 律师

灰度直方图及直方图均衡化

timerring

图像处理 数字图像处理

2023年中国人工智能产业趋势报告

易观分析

人工智能 科技 ChatGPT

构建隐私计算三大生态,百度点石为政务数据要素市场护航

百度安全

隐私计算 百度安全

NFT艺术品铸造竞拍商城dapp系统开发合约定制

开发微hkkf5566

不为人知的网络编程(十五):深入操作系统,一文搞懂Socket到底是什么

JackJiang

一文看懂倚天云实例|科普漫画

云布道师

倚天实例

会声会影软件2023新功能详情介绍

茶色酒

会声会影2023

Asian Paints 利用 F5 Silverline Web Application Firewall 实现转型

F5 Inc

数字化转型 托管 云端

hometown-h5-template 一个开箱即用的前端H5解决方案 🎉

HoMeTown

架构 Vue 前端 vite ts

WebUI自动化测试框架搭建之需求整理、详细设计和框架设计

Python 自动化测试 unittest 测试框架 selenium

技术分享| 如何使用Prometheus实现系统监控报警邮件通知

anyRTC开发者

Linux 运维 Prometheus 服务器 系统监控报警邮件通知

软件测试/测试开发 | Frida 实现 Hook 功能的强大能力

测试人

软件测试 自动化测试 测试开发

理论+实战,详解Sharding Sphere-jdbc

华为云开发者联盟

开发 华为云 华为云开发者联盟 企业号 3 月 PK 榜

如何在OpenCV Python中从立体图像创建深度图?

吴脑的键客

OpenCV 计算机视觉

ChatGPT 不是黑魔法,“替代搜索引擎”言之尚早

Zilliz

搜索引擎 ChatGPT

2个月内如何在千人团队落地压测平台?

老张

项目管理 性能测试 全链路压测 压测平台

灵眸大赏第一天议程公布|超30+企业,共话“2023年增长”趋势

Morketing

活动 营销

IoT平台实现RRPC同步调用最佳实战——实践类

阿里云AIoT

物联网 API 应用服务中间件

我直接就是一个下载推特GIF动图的大动作!巨简单!

frank

twitter

设备在线/离线状态的缓存方案——实践类

阿里云AIoT

缓存 物联网 存储 数据格式 测试技术

IoT场景中查看设备当前运行状况实现方案——实践类

阿里云AIoT

物联网 存储

IoT平台业务通信Topic设计最佳实践(共享场景为例)——实践类

阿里云AIoT

物联网 网络性能优化

coreldraw2023新功能新图标功能介绍

茶色酒

CorelDraw2023

火山引擎DataLeap:揭秘字节跳动数据血缘架构演进之路

字节跳动数据平台

云服务 数据血缘 企业号 2 月 PK 榜

Serverless 时代开启,云计算进入业务创新主战场

阿里巴巴云原生

阿里云 Serverless 云原生

IoT物联网平台通信用Topic梳理——实践类

阿里云AIoT

物联网

揭秘可视化图探索工具 NebulaGraph Explore 是如何实现图计算的

NebulaGraph

可视化 图数据库

爱立信钱包平台 (Ericsson Wallet Platform) 与 F5 合作推动金融包容性和赋权

F5 Inc

架构 安全 金融 移动支付

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