HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

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

关注

评论

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

Day01:VBA和Python入门

披头

办公自动化 IT蜗壳教学 数据科学探究

谈产品和创业方向

Ryan Zheng

创业 产品

对话微众和红枣:预言机是区块链提供可信数据的基础设施

CECBC

区块链

代码审查:从 ArrayList 说线程安全

mzlogin

Java 代码审查

浅谈数仓、数仓模型分层

白程序员的自习室

大数据 解决方案 通用设计模型 数仓

net.coobird.thumbnailator.tasks.UnsupportedFormatException: No suitable ImageReader found for source data.

wjchenge

Elasticsearch 近实时搜索 Near Real-Time Search

escray

elastic 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 3月日更

进入大厂的简历应该是什么样子

我是程序员小贱

3月日更

滚雪球学 Python 之怎么玩转时间和日期库

梦想橡皮擦

28天写作 3月日更

[转]html5设计原理

小江

【LeetCode】设计哈希集合Java题解

Albert

算法 LeetCode 28天写作 3月日更

你最喜欢的奥斯卡电影是哪部?

wbliu85

熟练使用SSH客户端常用工具SecureCRT

xiezhr

Linux SSH securecrt SSH工具

太简单了!看完这篇还能不会SpringCloud+Nginx高并发?

Java架构追梦

Java nginx 架构 面试 SpringCloud

万事开头难——人为推进效应

Justin

心理学 28天写作 游戏设计

如何实现可靠UDP传输

赖猫

计算机网络 udp TCP/IP

种春草肥禾,织数字天下

脑极体

阿里Java岗个人面经分享(技术三面+技术HR面):Java基础+Spring+JVM+并发编程+算法+缓存

Java架构之路

Java 程序员 架构 面试 编程语言

css高度坍塌与清除浮动

依旧廖凯

28天写作 3月日更

Zookeeper.01 - 简介

insight

zookeeper 3月日更

资深大牛带你了解源码!最详细的docker中安装并配置redis,实战解析

欢喜学安卓

android 程序员 面试 移动开发

2021字节面经最新整理: 面试真经/思维导图/学习笔记!火遍全网

比伯

Java 编程 架构 面试 计算机

寻找被遗忘的勇气(十三)

Changing Lin

3月日更

说说RPC架构

Kylin

读书笔记 3月日更 日常积累 RPC架构

Python 日期格式和时间以及当前时间和时间戳

HoneyMoose

《经济学人》2021年3月13日刊精彩文章导读及资源免费下载

wbliu85

MySQL主从复制机制

luojiahu

MySQL 主从复制

美团工作7年,精华全在这份学习笔记里了,已成功帮助多位朋友拿到5个大厂Offer

Java架构之路

Java 程序员 架构 面试 编程语言

算法攻关 - 重上到下打印二叉树 (O(n))_offer32

小诚信驿站

刘晓成 小诚信驿站 28天写作 算法攻关 从上到下打印二叉树

微服务学习笔记

lenka

3月日更

资深大牛带你了解源码!面试题解析已整理成文档,已拿offer

欢喜学安卓

android 程序员 面试 移动开发

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