DDD领域驱动设计实战 - 创建实体身份标识的常用策略(下)

简介: DDD领域驱动设计实战 - 创建实体身份标识的常用策略(下)

持久化机制生成唯一标识

若从DB获取一个序列值(Sequence)或递增值,结果总是唯一。根据标识所需范围,数据库可生成2字节、4字节和8字节的唯一标识。在Java中的这些大小整数分别可表示

  • 32,767
  • 2,147,483,647
  • 9,223,372,036,854,775,807

种不同标识值。

缺陷

性能。

从DB获取标识比APP生成慢得多。一种解决方法是将数据库序列缓存在APP,比如缓存在资源库。

这固然是一种好方法,但若服务器节点需重启,那么将失去很大一部分标识值区间。若丢失区间无法接受或只需相对较小标识值(2字节整数),这缓存机制便不实用,也没必要。当然可以找回丢掉的标识值区间,但可能引入新麻烦。

如果可使用延迟生成,那缓存标识便不是问题。以下是如何使用Hibernate和Oracle的序列来生成标识:

<id name="id" type="long" column="product_id"> 
  <generator class="sequence">
    <param name="sequence">product_seq</param>
  </generate> 
</id> 

在采用MySQL的自增列时配置如下

<id name="id" type="long" column="product_id"> 
  <generator class="native"/>
</id> 

这种方式的性能是很好的,同时配置Hibernate映射也是简单的。

3.1.3 另一个限界上下文提供唯一标识

若另一个限界上下文用于给实体标识赋值,那需要对每个标识进行查找、匹配和赋值。

最重要的是精确匹配。此时用户需提供一或多种属性,比如账户、用户名和E-mail地址,以精确定位需要匹配的结果。

通常匹配的输入是模糊的,导致多个查询结果,此时用户需要手动选择,如图

  • 从外部系统中获取需要查找的唯一标识。用户界面中可显示唯一标识(本图),也可不显示
  • image.png
  • 用户输入了模糊查找信息,通过调用外部限界上下文的API,返回的结果可能是0、1或多个匹配对象。接着用户要在结果中选择某特定对象。所选对象的身份标识将作为本地标识。外部实体的一些额外属性也可能被复制到本地实体。
  • 缺陷

对象同步可能是个问题。外部对象的改变将如何影响本地对象?如何知道所关联的对象已经改变了呢?

可通过事件驱动架构和领域事件解决。本地限界上下文订阅外部系统中的领域事件,当本地上下文接收到外部系统的事件通知时,它将相应更新本地对象。有时同步事件可能由本地上下文发出,外部系统在接受到该事件时同样会做相应的更新操作。

要达到这样的目的并不容易,但这样做能够创建出更加具有自治性的系统。可将对象查找限定在本地对象中。这并不是说将外部对 象缓存在本地系统中,而是将外部概念翻译成本地限界上下文中的概念。

这是最为复杂的标识创建策略。要维护本地实体,我们不但需要考虑由本地 领域行为所导致的改变,还需要将外部系统也考虑在内。所以在使用这种策略时,应持保守态度。


参考


《实现领域驱动设计》


目录
相关文章
|
网络协议 Python
在Python中进行UDP(User Datagram Protocol)网络编程
在Python中进行UDP(User Datagram Protocol)网络编程
451 3
|
机器学习/深度学习 人工智能 算法
机器学习-线性模型(波士顿房价预测)
机器学习-线性模型(波士顿房价预测)
|
开发者
冷门但好看的 VSCode 主题推荐
笔者在使用VSCode进行开发的过程中喜欢没事就逛一逛插件商店里的颜色主题,也看过国内外许多论坛上面的颜色主题推荐,不知不觉已经下载了超过一百个的颜色主题。这篇文章总结了我用过的最舒服的一些颜色主题。
8089 0
冷门但好看的 VSCode 主题推荐
|
自然语言处理 算法 BI
Baum-Welch算法
Baum-Welch算法是一种用于隐马尔可夫模型(HMM)的训练算法,通过期望最大化(EM)框架迭代估计模型参数,直至收敛。该算法主要应用于语音识别、生物信息学和自然语言处理等领域,通过优化初始状态概率、状态转移概率和观测概率,提高模型对观测数据的拟合度。尽管存在局部最优和计算复杂性等挑战,但仍是HMM参数估计的重要工具。
|
JavaScript 前端开发 小程序
基于springBoot + Vue电影售票系统分前后台【完整源码+数据库】
基于springBoot + Vue电影售票系统分前后台【完整源码+数据库】
319 4
|
SQL 存储 负载均衡
Flume(二)【Flume 进阶使用】(1)
Flume(二)【Flume 进阶使用】
|
存储 Java 测试技术
迄今为止最完整的DDD实践
对于一个架构师来说,在软件开发中如何降低系统复杂度是一个永恒的挑战。
23140 8
|
弹性计算 固态存储 数据可视化
阿里云服务器价格表(收费标准报价)
阿里云ECS云服务器价格是用户关心的,新手站长来说说阿里云服务器官方报价及优惠折扣后的价格,详细如下: 阿里云服务器价格组成 新手站长先介绍云服务器官方报价(包括按量付费和包年包月的价格),然后再分享优惠活动中云服务器优惠价格。
51153 0
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
1091 0
|
关系型数据库 测试技术 调度
《领域驱动设计》:从领域视角深入仓储(Repository)的设计和实现
本文首先从聚合根的生命周期和生存环境出发,引出了Repository概念,并说明其本质是管理中间过程的集合容器(2.1节); 根据集合容器的概念,在领域角度去挖掘出Repository的职责,并提出了仓储实体转移模式用作对不同仓储实现的对比标准(2.2节); 然后从实现例子出发,介绍了一种纯内存实现的仓储,用作体现仓储最佳实现(3.1节); 继续从实现例子出发,介绍了关系型数据库下的仓储特点,并描述面向持久化的仓储的特点(3.4节);

热门文章

最新文章