第二章:需求分析与数据建模
说实话,很多做库存系统的朋友,一上来就撸代码。结果呢?做到一半发现字段不够用,表结构要重来。我见过太多这样的项目了。
今天咱们聊聊数据建模的完整流程。从业务需求到数据字典,一步都不能少。
2.1 业务需求梳理
做数据建模前,先搞清楚业务到底要什么。我习惯用「三问法」来梳理:
- 谁在用?——仓库管理员、采购员、销售员、财务
- 做什么?——入库、出库、盘点、调拨、退货
- 要什么结果?——实时库存、预警提醒、报表分析
举个例子。我之前帮一家电商公司做库存系统。他们一开始说「就要个进销存」。结果聊深了才发现,他们需要的是多仓库、多货主、批次管理的复杂系统。嗯,这就是需求没梳理透的后果。
核心业务场景清单:
- 采购入库:供应商送货 → 质检 → 上架
- 销售出库:订单生成 → 拣货 → 打包 → 发货
- 库存盘点:周期盘点 → 差异调整 → 账实相符
- 库存调拨:A仓 → B仓,需要记录调拨单
- 退货处理:客户退货 → 质检 → 良品/不良品区分
2.2 数据实体识别
业务场景理清了,接下来就是找「实体」。说白了,实体就是我们要在数据库里存什么东西。
我个人习惯用名词提取法。把业务描述里的名词圈出来,基本就是候选实体了。
核心实体列表:
| 实体名称 | 业务含义 | 关键属性举例 |
|---|---|---|
| 商品 | 库存管理的最小单位 | SKU、名称、规格、单位 |
| 仓库 | 物理存储位置 | 仓库编码、名称、地址、类型 |
| 入库单 | 记录入库操作 | 单号、日期、供应商、状态 |
| 出库单 | 记录出库操作 | 单号、日期、客户、状态 |
| 库存记录 | 商品在仓库的实时数量 | 商品ID、仓库ID、数量、批次 |
| 供应商 | 提供商品的合作方 | 编码、名称、联系人、电话 |
| 客户 | 购买商品的合作方 | 编码、名称、等级、信用额度 |
小提示:实体识别时,别把「状态」当成实体。状态是属性,不是实体。我曾经见过有人把「订单状态」单独建一张表,结果查询时关联得想哭。
2.3 ER图设计
实体找出来了,接下来就是画关系。ER图是数据建模的灵魂。你想想看,没有ER图,你怎么跟业务方沟通?光靠嘴说「这个表关联那个表」?不现实。
下面我用SVG画一个核心的ER图,展示库存系统的主要实体关系:
这张图展示了核心实体之间的关系。注意看,库存记录是商品和仓库的关联实体。为什么?因为一个商品可以存在多个仓库,一个仓库也有多个商品。这就是典型的多对多关系,需要拆成关联表。
避坑指南:我曾经犯过一个错误——把库存数量直接存在商品表里。结果每次出入库都要更新商品表,并发一高就死锁。后来老老实实拆成库存记录表,用乐观锁解决并发问题。记住:库存是动态数据,别跟静态属性混在一起。
2.4 数据字典编写
ER图画完了,接下来就是写数据字典。说白了,就是给每个字段写「身份证」。字段叫什么、什么类型、多长、能不能为空、默认值是什么,都得写清楚。
我习惯用表格来写数据字典。下面以「库存记录表」为例:
| 字段名 | 类型 | 长度 | 是否主键 | 是否外键 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|---|---|---|
| id | BIGINT | 20 | 是 | 否 | 是 | 自增 | 记录唯一标识 |
| product_id | BIGINT | 20 | 否 | 是 | 是 | 无 | 关联商品表 |
| warehouse_id | BIGINT | 20 | 否 | 是 | 是 | 无 | 关联仓库表 |
| quantity | DECIMAL | 18,2 | 否 | 否 | 是 | 0.00 | 当前库存数量 |
| batch_no | VARCHAR | 50 | 否 | 否 | 否 | NULL | 批次号,可为空 |
| location | VARCHAR | 100 | 否 | 否 | 否 | NULL | 库位编码 |
| created_at | DATETIME | 无 | 否 | 否 | 是 | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | 无 | 否 | 否 | 是 | CURRENT_TIMESTAMP | 更新时间 |
个人经验:写数据字典时,我建议把「说明」字段写得详细点。别偷懒写「库存数量」四个字就完事了。要写清楚「这个数量是可用库存还是物理库存?是否包含在途?是否包含锁定?」。你想想看,半年后你自己回来看这个字典,如果说明写得太简单,你一样得猜。
数据字典写完后,最好让业务方也签个字。别笑,我真见过因为「库存数量」的定义没对齐,导致财务和仓库吵起来的案例。仓库说「库存是货架上的」,财务说「库存是账面上的」,两个数对不上,最后发现是口径问题。
好了,需求分析和数据建模就聊到这儿。记住一句话:建模花的时间,会在编码阶段十倍还给你。别急着写代码,先把模型搞扎实。
公众号:蓝海资料掘金营,微信deep3321