`

领域对象建模2:保持数据的完整性

 
阅读更多
转帖:http://xiaoqing.me/2012/01/domain-object-data-integrity/
上一节中,我们介绍了通过createdAt和updatedAt两个字段可以简化领域对象的设计,因为它们捕捉到了最常用的数据,可以简化模型设计。但是常用不代表够用,数据的完整性是任何一个系统必须考虑的。请看:

小明设计了PromotionItem表示促销商品,并知道商品的最新状态和更新时间。春节过后,框框网的促销专区还算可以,不及预想的那么火爆,但是销量比之前上升明显。业务人员想从中做一些数据分析,比如商品从上架到卖出花费多长时间,从而知道哪些类型的商品好卖,以及跟折扣的关系。

这种情况下,小明是没法数据分析的,因为他的建模缺少了历史数据:商品几月几号上架,几月几号下架了,几月几号卖出了。这些实实在在发生过的数据,在PromotionItem一个对象中是很难完整保留的。即使采用之前的onlineTime/offlineTime/expireTime等多个字段也不行,因为商品有可能下架之后重新上架。

所以一旦业务有了新的需求,就无法满足需要。更要命的是,如果系统已经上线,业务再提出这些需求,我们就永远失去了这些历史数据。

这种情况我们叫做丢失了数据的完整性。


此时,我们在建模时,可以给关键领域对象设置关联的历史纪录(或者事件),比如PromotionItemHistory(当然也可以是PromotionItemEvent,一样的思路),把促销商品的每一个状态变化记录下来:

有了历史记录,就可以真正做到“手中有粮,心里不慌”了。这与徐昊在InfoQ上的文章《》其实是类似的思路:通过时标查找重要的领域对象,每个时标都会带来领域对象的变化,而且很多时候是状态的变化,并且把状态变化捕捉下来,以达到数据的完整性。

通过记录状态的变化,可以很容易和基于事件的,或者事件驱动的架构结合起来。比如,业务又来新需求了:每当有产品卖出的时候,业务的头想立刻收到邮件…

这个功能本身不难实现,但考虑到发送邮件不是业务的核心功能,而只是业务支撑,或者业务的增强,我们可以把发送邮件的代码与业务的核心代码分开。怎么分呢,发送邮件的Service可以监听商品的状态发生变化,并适时实现自己的功能,从时序图来说,就是从原来的:




替换为下面的实现:



通过修改,把短信和商品的紧耦合编程了松耦合。而且,随着业务量的增大,如果这里出现了性能瓶颈,可以考虑把同步的通知改成异步,甚至可以考虑引入消息中间件——当然,这取决于系统的规模和业务量。
  • 大小: 37.7 KB
  • 大小: 30.3 KB
  • 大小: 37.5 KB
分享到:
评论

相关推荐

    ArcGIS对象建模与 geodatabase

    - **空间关系管理**:通过内置的拓扑规则,geodatabase能够维护要素之间的空间关系,如“面不能有空洞”或“线不能交叉”,这对于保持数据质量和完整性至关重要。 - **高级数据分析**:geodatabase支持复杂的空间...

    ERwin数据建模(杨国强)-完整版

    《ERwin数据建模(杨国强)-完整版》是一个综合性的资源,包含了数据建模领域的详尽教程,由知名专家杨国强提供。在信息化时代,数据建模是IT行业中不可或缺的一部分,它帮助企业构建高效、准确的数据存储系统,为...

    领域本体建模方法概述

    - **完整性**:涵盖所有必要的概念和关系。 - **一致性**:避免逻辑矛盾。 - **最大单调可扩展性**:容易添加新概念而不破坏现有结构。 - **最小承诺**:对建模对象的约束最少。 - **最小编码偏差**:独立于...

    数据建模_姜启源_教案

    4. 数据库设计过程:这部分可能包含需求分析、范式理论(如第一范式、第二范式和第三范式)以及数据库规范化,这些都是确保数据完整性和减少冗余的关键步骤。 5. 关系数据库设计:SQL语言的基础知识可能会被提及,...

    UML面向对象建模.pdf

    **UML面向对象建模详解** UML(Unified Modeling Language),即统一建模语言,是一种标准的图形化建模语言,用于软件工程领域,特别是面向对象设计和分析。UML提供了一种可视化的方式来描述系统的需求、结构和行为...

    000001_DDD领域建模知识分享.pptx

    6. **聚合(Aggregate)**:保持数据一致性的最小单元,由实体和值对象组成,有一个聚合根负责整个聚合的完整性和一致性。 7. **聚合根(Aggregate Root)**:聚合内的主实体,是外部访问聚合的唯一入口。 **DDD的...

    2018年度研究生数学建模比赛:数据清洗、SOM、PSO模型.zip

    数学的特点不仅在于概念的抽象性、逻辑的严密性、结论的明确性和体系的完整性,而且在于它应用的广泛性。 自从20世纪以来,随着科学技术的迅速发展和计算机的日益普及,人们对各种问题的要求越来越精确,使得数学的...

    ERWin数据建模-杨国强版

    第二部分(part2)可能会涉及更高级的主题,如复杂关系处理、数据完整性规则、索引设计和性能调优等。 学习ERWin数据建模不仅可以提高数据库设计的专业性,还能促进团队间的有效沟通,确保项目数据模型的质量和一致...

    运用四色建模法进行领域分析

    值对象关注的是对象的属性,不强调其身份,而是强调其值的完整性,例如地址、价格等。它们用于确保数据的精确性,并可以与实体进行比较和操作。 4. **黄色**:表示行为或操作。黄色标记的行为是实体或值对象执行的...

    Oracle 8 UML对象建模设计

    在Oracle 8中,这些关系可以转化为外键、主键和引用完整性约束。 用例图则描述了系统的主要参与者(actors)和他们能执行的动作(use cases)。在Oracle数据库设计中,参与者可能包括用户、应用程序或其他系统,而...

    领域驱动设计和开发实战.pdf

    - **事务管理**:确保数据的一致性和完整性。 - **安全性考量**:保障系统免受未经授权的访问。 - **代码生成**:利用工具自动生成代码,减少手工编码的工作量。 - **测试驱动开发**:采用TDD(Test-Driven ...

    信息系统面向对象设计 uml建模

    【信息系统面向对象设计 UML建模】 UML(Unified Modeling Language),统一建模语言,是一种在软件工程...在档案管理系统的设计中,UML建模将确保系统功能的完整性和操作的流畅性,同时也能促进团队间的沟通与协作。

    《UML面向对象建模基础》课后习题答案.docx

    ### UML面向对象建模基础知识点解析 #### 第1章 UML概述 ##### UML的主要特性 1. **UML是一种语言**:UML(Unified Modeling Language)是一种标准化的建模语言,它允许开发者和非技术人员共同理解系统设计,通过...

    领域建模和架构说明

    - **聚合根(AGGREGATE ROOTS)**:是一种特殊的实体,它们是聚合的入口点,控制着聚合内的对象的完整性和一致性。聚合根可以包含其他实体或值对象。 #### 其他领域概念 除了上述核心概念外,领域驱动设计还包括...

    从领域建模到模型驱动--j建模理论进展

    - **模型验证**:确保模型的正确性和完整性,可以通过形式化方法进行验证。 - **模型转换**:将领域模型转换为具体的实现细节,如代码或配置文件。 - **模型部署**:将生成的代码或配置文件部署到目标环境中。 ####...

    Oracle_8_UML对象建模设计

    Oracle_8_UML对象建模设计是Oracle数据库系统在软件工程领域中的一种应用,它结合了UML(统一建模语言)的理论与Oracle数据库的实际操作,为开发者提供了一种强大的工具来理解和设计复杂的数据库系统。Oracle是全球...

    使用PowerDesigner 进行数据建模

    1. **定义业务规则**:业务规则定义了业务运作的基本原则和限制条件,例如数据完整性规则、数据输入规则等。通过明确这些规则,可以确保设计出来的模型符合业务需求。 2. **建立数据项、实体和实体属性**:数据项是...

    数据仓库建模指南笔记

    高质量的数据建模需要遵循一系列原则:明确业务需求、深入理解业务领域、保持模型简洁、避免过度复杂化,同时要考虑到未来可能的变化。此外,良好的文档记录和团队沟通至关重要,确保所有参与者对模型有共同的理解。...

    数据建模安装包

    Enterprise Architect提供了多种数据建模工具,如ER图(实体关系图)用于描绘数据库结构,类图和对象图用于表示面向对象的设计,以及数据流图和状态图等,帮助用户全面理解系统的数据处理过程。它支持多种标准,如...

Global site tag (gtag.js) - Google Analytics