【AICon】AI 基础设施、LLM运维、大模型训练与推理,一场会议,全方位涵盖! >>> 了解详情
写点什么

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

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

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

关注

评论

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

Android 原生控件ViewFlipper实现淘宝头条垂直滚动广告条

android 程序员 移动开发

Android 性能优化:手把手带你全面了解内存泄露

android 程序员 移动开发

Android 性能监控系列一(原理篇)

android 程序员 移动开发

android 方式实现imageview圆角

android 程序员 移动开发

Android 自定义软键盘实现 数字九宫格

android 程序员 移动开发

Android 这座山,我一定要爬到顶

android 程序员 移动开发

基于 KubeVela 的 GitOps 交付

阿里巴巴云原生

阿里云 Kubernetes 云原生 gitops KubeVela

android 定位到输入的地址

android 程序员 移动开发

Android 教你一步步搭建MVP+Retrofit+RxJava网络请求框架

android 程序员 移动开发

Android 横向ListView实现

android 程序员 移动开发

Android 获取设备信息

android 程序员 移动开发

android 图表基本属性方法设置

android 程序员 移动开发

Android 开发规范(完结版)

android 程序员 移动开发

Android 抖音爆红的口红挑战爬坑总结

android 程序员 移动开发

Android 设置默认Launcher

android 程序员 移动开发

Android 调用相机拍照,适配到Android 10

android 程序员 移动开发

Android 多渠道打包配置

android 程序员 移动开发

android 实现 搜索保存历史记录功能

android 程序员 移动开发

Android 序列化(Serializable和Parcelable)

android 程序员 移动开发

Android 开发者想咸鱼翻身并不是难事,只要你掌握这些……

android 程序员 移动开发

Android 开发艺术探索笔记(21)

android 程序员 移动开发

Android 开发面试中,面试过最喜欢问那些问题?

android 程序员 移动开发

Android 开发,你遇上 Emoji 头疼吗?

android 程序员 移动开发

Android 拍照:如何使用已有相机应用捕获图片(Taking Photos Simply)

android 程序员 移动开发

Android 自定义软键盘实现 数字九宫格(1)

android 程序员 移动开发

Android 使用讯飞语音SDK

android 程序员 移动开发

Android 图像处理

android 程序员 移动开发

Android 开发中,与屏幕有关的三个小众知识

android 程序员 移动开发

Android 程序员不得不收藏的 90+ 个人博客(持续更新

android 程序员 移动开发

Android 实现系统深度休眠笔记

android 程序员 移动开发

Android 开发艺术探索笔记(1)

android 程序员 移动开发

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