3. 从业务流程到概念模型:用“名词法”和“动词法”提取核心实体与关系

很多刚入行的同事问我:“数据模型到底怎么开始?”
我的回答通常很简单——别急着画表,先看懂业务在干什么。

概念模型是数据架构的第一张蓝图。它不关心字段类型,不关心主键设计,只关心两件事:业务里有哪些“东西”,以及这些“东西”之间怎么关联。

我个人习惯用两种方法从业务流程里“挖”出这些东西——名词法和动词法。说白了,一个帮你找实体,一个帮你找关系。

3.1 名词法:从业务描述中抓出核心实体

什么是实体?
实体就是业务里那些独立存在、可以被识别、有业务意义的对象。比如客户、订单、产品、仓库。

名词法的操作很简单:
拿一段真实的业务流程描述,把里面的名词全部圈出来,然后筛选。

举个例子,这是一段典型的电商下单流程:

“顾客在网站上浏览商品,将商品加入购物车。确认后提交订单,系统扣减库存,生成发货单。仓库人员根据发货单拣货、打包,交由物流公司配送。顾客收到商品后可以确认收货并评价。”

圈出名词:

  • 顾客、网站、商品、购物车、订单、库存、发货单、仓库人员、物流公司、收货、评价

然后做筛选——去掉那些只是状态或动作的名词,比如“收货”其实是动作,“网站”只是渠道。剩下的是:

候选名词 是否实体 理由
顾客 ✅ 是 独立业务主体,有属性(姓名、地址)
商品 ✅ 是 核心业务对象,有SKU、价格
购物车 ⚠️ 视情况 如果只是临时容器,可以归为订单的一部分
订单 ✅ 是 交易核心,有状态、金额
库存 ✅ 是 商品的数量维度,可独立管理
发货单 ✅ 是 物流环节的核心单据
物流公司 ✅ 是 外部合作伙伴,有独立属性
评价 ✅ 是 顾客对商品的反馈记录
我的经验: 名词法第一轮圈出来的东西往往偏多。别怕,后面会合并和剔除。我一般会保留所有候选,等动词法做完再统一清理。

3.2 动词法:从业务动作中提炼实体关系

实体找到了,它们之间怎么连?
这时候看动词。

动词法就是:把业务流程里的动作找出来,每个动作往往对应一个关系。

还是刚才那段流程:

  • “顾客浏览商品” → 顾客和商品之间是浏览关系
  • “顾客提交订单” → 顾客和订单之间是创建关系
  • “订单扣减库存” → 订单和库存之间是影响关系
  • “仓库人员生成发货单” → 发货单和订单之间是关联关系
  • “物流公司配送发货单” → 物流公司和发货单之间是承运关系
  • “顾客评价商品” → 顾客和商品之间是评价关系

把这些动词翻译成数据模型里的关系,通常就是:

源实体 动词 目标实体 关系类型 基数
顾客 提交 订单 一对多 1个顾客 → N个订单
订单 包含 商品 多对多 1个订单 → N个商品
订单 扣减 库存 一对多 1个订单 → N个库存记录
订单 生成 发货单 一对一 1个订单 → 1个发货单
发货单 承运 物流公司 多对一 N个发货单 → 1个物流公司
顾客 评价 商品 一对多 1个顾客 → N个评价
注意: 动词法容易犯一个错——把“动作”直接当成关系。比如“扣减”其实是业务逻辑,不是实体之间的直接关联。正确的做法是:把动词转化为实体之间的静态联系,而不是操作过程。

3.3 合并与去重:从候选到最终概念模型

名词法和动词法做完后,你会得到一堆候选实体和候选关系。接下来要做的是合并、去重、抽象。

我一般按这几步走:

  1. 合并同义词:比如“顾客”和“客户”是同一个东西,保留一个。
  2. 剔除临时对象:比如“购物车”如果只是会话级别的临时容器,可以不作为独立实体。
  3. 抽象共性:比如“发货单”和“退货单”如果结构相似,可以抽象成“单据”。
  4. 确认关系基数:每个关系都要问一句“一个A对应几个B?”

最终,我们得到这样一个概念模型:

核心实体清单:
  • 顾客(Customer)
  • 商品(Product)
  • 订单(Order)
  • 订单明细(OrderItem)
  • 库存(Inventory)
  • 发货单(Shipment)
  • 物流公司(Carrier)
  • 评价(Review)

3.4 概念模型的可视化:用SVG画一张关系图

光有文字清单不够。我习惯把概念模型画出来,这样业务方和开发都能一眼看懂。

下面这张图展示了我们刚才推导出的电商核心概念模型:

电商核心概念模型(概念层) 顾客 订单 订单明细 商品 库存 发货单 物流公司 评价 提交 包含 引用 管理 生成 承运 发表 针对 说明:箭头方向表示“谁指向谁”,例如“顾客提交订单”即顾客指向订单。所有关系均为概念层定义, 不包含具体字段和主外键设计。 图例: 顾客/物流 订单/评价 订单明细 商品 库存 发货单

3.5 避坑指南:我踩过的三个坑

方法讲完了,说点实在的。这些年我用名词法和动词法做过不下几十个模型,踩过不少坑。

坑一:把“属性”当成“实体”
我曾经在一个项目中,把“商品颜色”单独做成了一个实体。结果发现它除了颜色值什么都没有,纯粹是商品的一个属性。后来重构时合并回去了。
判断标准: 如果一个“名词”只有一两个属性,且只被一个实体引用,它大概率是属性,不是实体。
坑二:动词法找出的关系太多
有一次我对着一个复杂的审批流程做动词法,找出了30多个关系。后来发现一半都是“审核”、“驳回”、“转交”这类动作,其实它们只是状态流转,不是实体之间的静态关系。
我的做法: 只保留那些在数据层面有持久化意义的关系。临时动作交给状态机,别塞进概念模型。
坑三:忽略业务语义的“多对多”
订单和商品之间看起来是多对多——一个订单包含多个商品,一个商品出现在多个订单里。但如果你直接画多对多,后面逻辑模型会很难做。
解决方案: 引入“订单明细”作为中间实体,把多对多拆成两个一对多。这是概念模型阶段就该做的。

3.6 小结:概念模型的价值

概念模型做得好不好,直接决定后面逻辑模型和物理模型的质量。我个人觉得,花在概念模型上的时间,至少占整个数据建模工作的30%。

为什么?
因为概念模型是业务和技术之间的翻译器。业务方看不懂ER图,但看得懂“顾客-订单-商品”这种关系。你拿着这张图去跟业务确认,他们能直接说“不对,我们还有退货流程”。这时候改,成本最低。

记住一句话:概念模型错了,后面全是白做。