第二章:需求分析与数据建模

说实话,很多做库存系统的朋友,一上来就撸代码。结果呢?做到一半发现字段不够用,表结构要重来。我见过太多这样的项目了。

今天咱们聊聊数据建模的完整流程。从业务需求到数据字典,一步都不能少。

2.1 业务需求梳理

做数据建模前,先搞清楚业务到底要什么。我习惯用「三问法」来梳理:

  • 谁在用?——仓库管理员、采购员、销售员、财务
  • 做什么?——入库、出库、盘点、调拨、退货
  • 要什么结果?——实时库存、预警提醒、报表分析

举个例子。我之前帮一家电商公司做库存系统。他们一开始说「就要个进销存」。结果聊深了才发现,他们需要的是多仓库、多货主、批次管理的复杂系统。嗯,这就是需求没梳理透的后果。

核心业务场景清单:

  • 采购入库:供应商送货 → 质检 → 上架
  • 销售出库:订单生成 → 拣货 → 打包 → 发货
  • 库存盘点:周期盘点 → 差异调整 → 账实相符
  • 库存调拨:A仓 → B仓,需要记录调拨单
  • 退货处理:客户退货 → 质检 → 良品/不良品区分

2.2 数据实体识别

业务场景理清了,接下来就是找「实体」。说白了,实体就是我们要在数据库里存什么东西。

我个人习惯用名词提取法。把业务描述里的名词圈出来,基本就是候选实体了。

核心实体列表:

实体名称 业务含义 关键属性举例
商品 库存管理的最小单位 SKU、名称、规格、单位
仓库 物理存储位置 仓库编码、名称、地址、类型
入库单 记录入库操作 单号、日期、供应商、状态
出库单 记录出库操作 单号、日期、客户、状态
库存记录 商品在仓库的实时数量 商品ID、仓库ID、数量、批次
供应商 提供商品的合作方 编码、名称、联系人、电话
客户 购买商品的合作方 编码、名称、等级、信用额度

小提示:实体识别时,别把「状态」当成实体。状态是属性,不是实体。我曾经见过有人把「订单状态」单独建一张表,结果查询时关联得想哭。

2.3 ER图设计

实体找出来了,接下来就是画关系。ER图是数据建模的灵魂。你想想看,没有ER图,你怎么跟业务方沟通?光靠嘴说「这个表关联那个表」?不现实。

下面我用SVG画一个核心的ER图,展示库存系统的主要实体关系:

商品 商品ID (PK) SKU, 名称, 规格 仓库 仓库ID (PK) 编码, 名称, 地址 库存记录 记录ID (PK) 数量, 批次, 位置 入库单 单号 (PK) 日期, 供应商, 状态 出库单 单号 (PK) 日期, 客户, 状态 1 N 1 N 1 N 1 N 图例 主实体 关联实体 1:N 关系 可选关系

这张图展示了核心实体之间的关系。注意看,库存记录是商品和仓库的关联实体。为什么?因为一个商品可以存在多个仓库,一个仓库也有多个商品。这就是典型的多对多关系,需要拆成关联表。

避坑指南:我曾经犯过一个错误——把库存数量直接存在商品表里。结果每次出入库都要更新商品表,并发一高就死锁。后来老老实实拆成库存记录表,用乐观锁解决并发问题。记住:库存是动态数据,别跟静态属性混在一起。

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