知识卡片
实体与持久化对象的多种映射关系
内容
DDD的设计顺序和传统数据建模相反:不是先设计数据库表结构,而是先通过场景分析构建领域模型、找出实体对象和它们的行为,再把这些实体对象映射到数据库持久化对象(PO)。这个映射关系并不总是简单的一对一,而是有多种可能:大多数情况下确实是一对一;有些实体只是运行时暂驻内存的计算结果,根本不需要持久化,比如基于多个价格配置数据计算后生成的折扣实体,这种情况下是”一对零”;有些场景是一对多,比如用户(user)和角色(role)两个持久化对象组合起来才能生成一个权限实体;还有些场景是多对一,比如为了避免联表查询、提升性能,把客户信息(customer)和账户信息(account)两类数据存进同一张数据库表,客户和账户这两个实体就都可以从同一个持久化对象里生成。理解这种映射的灵活性很重要:它说明数据库表结构不应该被当作领域模型设计的起点或硬约束,领域模型该怎么划分实体,完全可以从业务逻辑本身的需要出发,数据库层面的存储形式是随后再根据性能、查询模式等因素灵活决定的。
参考来源
- 位置:第7章《实体和值对象:领域模型的基础单元》"7.1 实体","4. 实体的数据库形态"(源文件:_epub-src/OEBPS/Text/chapter3-3-1.xhtml)
- 结论依据:原文说明"在领域模型映射到数据模型时,一个实体可能对应0个、1个或者多个数据库持久化对象……用户user与角色role两个持久化对象可生成权限实体,一个DO实体会对应两个持久化对象,这是一对多的场景……客户和账户两个实体可根据需要从一个持久化对象中生成,这就是多对一的场景",直接支撑本卡片结论。
- 原始内容:在领域模型映射到数据模型时,一个实体可能对应0个、1个或者多个数据库持久化对象。大多数情况下实体与持久化对象是一对一……用户user与角色role两个持久化对象可生成权限实体,一个DO实体会对应两个持久化对象,这是一对多的场景。