写点什么

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

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

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

关注

评论

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

设计原则 — I 接口隔离原则

Lemoon Can

接口隔离原则 设计原则

矩阵起源荣获“IT用户满意度大会”年度新秀称号

MatrixOrigin

MatrixOrigin MatrixOne

Activity初窥门径

芯动大师

android App Activity

个人开发者应该如何选购云服务

光毅

秒懂算法 | Treap树

TiAmo

数据结构 算法 节点 旋转法

电商通用型商品中心设计

京东科技开发者

构架 企业号 3 月 PK 榜 电商中心 SKU 类目

一文讲透|如何部署OceanBase社区版(4.x版)

OceanBase 数据库

数据库 oceanbase

AIGC热门技术岗平均年薪超百万,脉脉林凡认为白领可能先于蓝领失业

科技热闻

MobPush 厂商通道SDK集成指南

MobTech袤博科技

DevOps |如何说清楚研发效能工作的价值?

laofo

DevOps cicd 研发效能 持续交付 研发效能度量

AI又火了,这一次云厂商能赚到钱吗?

脑极体

云计算 AI 云厂商

AI的道德风险验证

陈磊@Criss

pulsar:创建更多租户 VS 创建更多namespaces

李code

架构 pulsar 调优 业务

使用 DataEase 展示服务器运行状态

搞大屏的小北

Linux监控 Linux监控脚本 监控展示 监控大屏

轻松搞懂云成本优化:FinOps,2023年一定要懂的热点趋势!

博文视点Broadview

世界备份日|有“备”而来,才能不为数据安全“蕉绿”

云布道师

存储

腾讯云数据库性能打破世界纪录 每分钟可处理8.14亿笔交易

数据库小组

数据库 腾讯云 tdsql

从制作九转大肠来谈起 | GreptimeDB 如何提高多步操作的容错能力

Greptime 格睿科技

数据库 云原生 时序数据库 procedure

如何使用 MegEngine 生态落地一个算法

MegEngineBot

开源 性能优化 MegEngine 算法落地

“ChatGPT们”的淘金时代

OneFlow

RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践

阿里巴巴云原生

阿里云 RocketMQ 云原生

探索Python Web后端技术的发展之路

阿呆

深入探讨Python Tornado框架:原理与异步实现

阿呆

Python tornado Web

职场「OKR」,魔幻又内卷

Java 架构 职场 OKR

「高频必考」Docker&K8S面试题和答案

王中阳Go

Docker 高效工作 学习方法 面试题 Go 语言

一文读懂HAG:首个永久锚定BTC Mining算力的Security Token

股市老人

一文读懂mysql锁

Paincupid

MySQL MySQL锁 mysql锁原理 mysql如何上锁 msyql锁分类

从人工智能角度看人肉智能

FN0

AIGC

「行业化」会是ToB巨头们的新战场吗?

ToB行业头条

Sync包Mutex的原理阐述

Jack

golang

碳基大模型--人一生处理多少个token?

FN0

人工智能 AIGC ChatGPT

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