实践 DDD:值对象与实体

DDD 指的是 Domain-driven design(领域驱动设计),这套理论讲述的是如何在业务开发中建立业务模型,本文介绍最基本的实体和值对象概念。


从属性系统说起

以电商中的属性系统为例,搜索 iPhone 会展示很多筛选属性。机身内存 ROM、网络类型是「属性」,512G、256G、无需合约版、TD_LTE 是「属性选项」。表示为结构化的数据结构就是

{
  "rom":[512, 256, 128],
  "net_type": ["无需合约版", "TD_LTE"]
}

属性和属性系统应该如何存储到数据库中。一种方式是把属性和属性选型放在商品表的一个字段中。


商品 ID 商品名 属性
1001 iPhone12 大小:512G,颜色:白
1002 Huawei 大小:256G,像素:1 亿
1003 Xiaomi3 屏幕材质:OLED,尺寸:200 寸

如果属性和属性选项只是用来展示,这样存完全没有问题。但现在有这样的需求场景:

  1. 把商品中属性「屏幕材质」的名称修改为「屏幕材料」
  2. 用户搜索时,展示所有内存大小为 512G 的手机

第一个场景需要替换所有记录中的字段名称,第二个场景很难高效检索出来。这个时候就需要采用一种新的设计方式:

给属性新增自增标识符属性 ID,需要关联的地方使用属性 ID。


属性 ID 属性名
50001 颜色
50002 屏幕材质
50003 尺寸

给属性选项新增自增标识符属性选项 ID,需要关联的地方使用属性选项 ID。


属性选项 ID 属性选项名 属性 ID
3001 50001
3002 50001
3003 OLED 50002
3004 LED 50002
3005 512G 50003
3006 256G 50003

这样商品存储就变成了:


商品 ID 商品名 属性选项
1001 iPhone12 3005, 3001
1002 Huawei 3005, …
1003 Xiaomi3 3003, …

通过新增唯一标识符的方式,可以解决以上两个问题。当字段名修改时,由于表中关联的是 ID,所以无需改动。针对第二种场景一般使用搜索引擎,给属性选项字段建立倒排索引,这样就能实现高效检索。


值对象与实体

在 DDD 中第一种表示叫值对象,第二种叫实体。他们的区别是,实体拥有唯一标识符(主键 ID),且标识符在经过任何变化后仍然保持不变。对于这种实体,它其中的属性可以发生改变。而实体标识符的延续性会带来系统设计上的好处,以不变应万变。



Previous     Next
/
Published under (CC) BY-NC-SA in categories tagged with