仓库管理系统数据流图与数据字典:从DFD到数据库设计实战指南
简介仓库管理系统的数据流图与数据字典文档面向软件工程、信息系统分析与设计课程的师生以及需要完成仓库管理类系统需求分析的开发人员。内容以分层数据流图为主线从顶层到第一层逐步细化入库、出库、货物、客户、查询等模块并进一步展开入库信息管理、出库信息管理等加工流程清晰展示仓库管理员、采购员、供应商、顾客之间的数据流动关系。数据字典部分系统覆盖入库信息、出库信息、货物信息、客户信息、订货通知、分类订单、订单、发货单、到货单核准等关键数据流每条均给出来源、流向与组成说明同时列出货物编号、货物品名、规格、数量、进价、售价、客户信息等核心数据项及其类型长度。压缩包内为1个doc格式文档大小432KB便于查看、打印或直接引用。目前已有812人学习下载适合用作课程设计说明书、毕业设计文档或仓库管理系统开发前的需求建模参考。1. 仓库管理系统的数据流图与数据字典先把分析做扎实省的是后面改表的钱仓库管理系统听起来是最不起眼的信息系统入库、出库、盘点、调拨好像谁都能说两句。但真把“入库单”从谁手里来、要更新哪份库存、扣哪个仓库的账、最后影响哪张报表这几个问题问清楚十个业务人员能给你十个版本。数据流图和数据字典就是用来收敛这些版本的前者把数据的来龙去脉画成一张图后者把图里每一条数据的字段构成钉成文字。这玩意不是交课程设计用的“文档作业”而是数据库设计之前的原型设计。做毕设的学生、刚接仓库类项目的一线开发、以及要给企业做进销存系统的外包团队都能靠这套方法在建表写代码之前把返工压下来。2. 数据流图怎么画从上下文数据流图到0层分解把仓库拆成五个加工数据流图DFD是结构化分析方法里最核心的产物。第1章说过它的作用是“把数据的来龙去脉画成图”。这一章直接讲怎么动手画从最顶层的上下文图一路拆到可以落数据库的粒度。2.1 先分清四要素外部实体、加工、数据流和数据存储画DFD之前先把四个元素认准否则后面每张图都是野路子。DFD有两种常见画法流派Yourdon/DeMarco 和 Gane-Sarson图形符号略有差异表达逻辑一致。我一般用Gane-Sarson外部实体用矩形加工用圆角矩形数据流用带箭头的直线数据存储用开口矩形。工具上ProcessOn、draw.io、Visio都行关键是全组人用统一标准不要一张图上两种流派混着画。以仓库管理系统为例把四要素套一遍外部实体不属于系统、但和系统交换数据的人或部门。这个例子里是仓库管理员、采购员、财务人员、供应商。加工系统内部对数据的处理动作。比如“入库管理”“出库管理”“盘点管理”。数据流成批或单条的、在元素之间流动的数据。比如“入库单”“出库单”“库存预警”。数据存储系统需要长期保存的数据集合。比如“库存台账”“入库流水”“出库流水”。最容易翻车的点是数据流一定要用名词命名。“入库”是动作不能当数据流名要写成“入库单”“查询库存”也不能当数据流“库存报表”才是。加工才用动词而且建议统一成“动词名词”结构登记入库单、更新库存台账、生成盘点差异表。一张图上看到动词开头的箭头先停下来改名字——这是个非常有效的自检信号。提示数据流是数据在流动不是动作在流动。箭头旁边要么写单据名要么写报表名不要写操作名。2.2 上下文数据流图用一张图圈定仓库管理系统的边界上下文数据流图也叫顶层图是DFD分解的第一层。这张图里只有一个加工代表整个仓库管理系统所有外部实体画在系统边界外面用数据流把外部实体和这一个加工连起来。画这张图的目的是定边界哪些数据的处理在系统内部哪些在系统外部。仓库管理系统的上下文图我一般这样列外部实体仓库管理员、采购员、财务人员、供应商。指向系统的数据流入库单、出库单、盘点结果、采购订单核对用。从系统出去的数据流库存报表、库存预警、入库明细报表、出库明细报表。画的时候有一个顺序先把外部实体全部列出来再逐个人列出它朝系统发什么数据、从系统收什么数据最后检查每个外部实体至少有一条输入或一条输出不能有只挂在图上、没有任何数据流的“装饰实体”。这个检查很基础但实际评审时经常发现有人把“供应商”画上去结果供应商和系统之间一条箭头都没有。上下文图还有一个用途它是后面所有子图的总入口。0层图、1层图的数据流最终都要能和这张图上的输入输出对上否则就出了后面第4章要讲的平衡问题。2.3 0层图分解把仓库系统拆成五个加工上下文图只有一个加工没法看清系统内部。0层图就是把那个唯一加工分解成5到7个主要加工同时引入数据存储。仓库管理系统的0层图我拆成五个加工入库管理出库管理盘点管理调拨管理库存统计数据存储同步编号D1库存台账、D2入库流水、D3出库流水、D4盘点记录。数据存储用“D序号”编号加工用“数字”编号这是全图统一的坐标体系后面写数据字典和数据库表都要靠这套编号引用。0层图的信息量比上下文图大很多但真正的重点是加工与加工之间的数据传递。举一个典型例子入库管理这个加工接收“入库单”校验后写入D1库存台账同时追加一条D2入库流水出库管理接收“出库单”扣减D1库存台账追加D3出库流水库存统计这个加工则同时读D1、D2、D3生成“库存报表”。这些流转关系画清楚系统内部的耦合点就暴露了——比如“调拨管理”实际上同时操作仓库A的库存扣减和仓库B的库存增加它必须读写D1两次这个业务细节在上下文图阶段是看不见的。画0层图时还有一个原则父图子图平衡。上下文图里进入系统的“入库单”在0层图里必须进入加工“1.入库管理”上下文图里没有的数据流0层图不能凭空多出来。后面第6章会专门讲怎么验证画的时候先按这个原则自查一遍。2.4 图元素检查表画完一版先自查再评审画DFD最容易出现“画的时候很顺评审时被问住”的情况。我习惯每画完一层用下面这张表自查一轮全过了再往上提交检查项检查标准反面例子外部实体在系统边界外有实际的人或部门对应把“数据库”当外部实体加工动词名词至少有一个输入和一个输出“处理数据”“系统管理”数据流名词命名方向从数据来源指向数据去向“查询”“打印”数据存储逻辑命名带D编号“数据库”“文件”命名一致性同一数据流在不同图层名字完全相同上面写“入库单”下面写“入库通知”字典对应图上每个名字能在数据字典里找到图上有“库存预警”字典里搜不到这张表不用背打印出来贴在工位边上就行。第4章讲的常见坑绝大多数都能被这表提前拦下来。3. 数据字典怎么写六个条目把数据流图的每个元素钉死数据流图画完之后图上的每一个元素还是“黑匣子”光看“入库单”三个字你不知道它包含哪些字段、从哪来、到哪去。数据字典就是把这个黑匣子打开逐条登记。数据字典有六类条目数据项、数据结构、数据流、数据存储、处理逻辑、外部实体。这一章按书写顺序逐个讲。3.1 数据字典的表示符号、、{}、[]这些记号的含义数据字典有自己的表示符号逻辑和正则表达式有点像。写熟了之后一个组合数据结构可以压缩成一行比大段文字好读得多符号含义示例由……组成入库单 入库单号 入库日期 ……与表示同时存在入库单号 入库日期{}重复可加上下标表示次数入库明细{货物编号 数量 单价}[]选择其中一项[采购单号()可选非必填(备注)用这套符号把“入库单”写成字典条目就是入库单 入库单号 入库日期 仓库编号 经办人 入库明细{货物编号 数量 单价} [采购单号 | 手工入库单]这行式子表达了三层信息第一入库单必须有哪些字段第二入库明细是多行重复结构第三入库单的来源要么关联采购单号要么是手工入库。评审时拿这行式子给业务人员看对方能直接告诉你哪个字段多余、哪个字段漏了——比给一堆文字描述高效得多。3.2 数据项和数据结构条目仓库里每块数据的最小定义数据项是数据字典里最小的单位对应数据库里的一个字段。它不需要再拆比如“货物编号”“数量”“单价”就是数据项。每个数据项条目要写清楚名称、别名、类型、取值范围和说明。以“货物编号”为例标准的数据项条目是这样条目项内容数据项名货物编号别名存货编码、物料编码、SKU类型字符型格式/取值范围XX-YYYYXX为货物大类YYYY为四位流水说明唯一标识一种货物为什么要把数据类型和格式写死因为后面建表时VARCHAR的长度、是否用雪花ID还是自增ID、需不需要前缀编码全部要在这里定。我见过不少项目数据字典里写“货物编号”开发凭感觉定了一个VARCHAR(10)结果客户说编号有12位整张表推倒重来。这类坑写在数据字典阶段成本是十分钟写在数据库阶段成本是半天。数据结构是数据项的集合对应数据库里的一张表或一张子表。比如“入库明细”本身就是一个数据结构入库明细 {货物编号 数量 单价}数据结构条目要列出它的组成、它的上级结构是谁、在哪些数据流里出现。写数据结构时尽量把嵌套层级控制住主表一层、明细一层最多三层再深就该拆表了。3.3 数据流条目和数据存储条目跟着图逐条登记数据流条目是连接DFD和数据字典的关键。图上有多少条带箭头的线字典里就要有多少条数据流条目。每一条都要登记来源、去向、组成、流量。以“入库单”这条数据流为例条目项内容数据流名入库单来源仓库管理员外部实体去向加工1 入库管理组成入库单 入库单号 入库日期 仓库编号 经办人 入库明细{货物编号 数量 单价} [采购单号平均流量约10单/天旺季峰值50单/天说明每单明细行数1到50行来源和去向必须写这是后面验证DFD是否平衡的依据。流量也要写它直接决定数据库怎么设计如果每天只有10单单表就够了如果每天几十万单就要考虑按月分表。很多团队做仓库系统不做容量估算等系统上线半年后卡死才开始补方案问题往往就出在数据流条目里缺了流量字段。数据存储条目登记的是DFD里的开口矩形。以D1库存台账为例条目项内容数据存储名库存台账编号D1流入数据流更新后的库存数量来自加工1/2/4流出数据流库存读数到加工5组成库存台账 货物编号 货物名称 当前库存数量 安全库存量 库位编号 最近变动时间数据存储条目不要写“存到MySQL还是SQL Server”那是物理存储设计数据字典阶段只关心逻辑上存了什么数据。如果你在用用友NC、T这类现成的ERP产品它们的系统数据字典本质上也是同一套东西只是字段名被厂商固化了你去查NC数据字典、T数据字典核心还是看“哪张表存什么数据、数据从哪来”思路和这里完全一致。3.4 处理逻辑条目把加工规则写成结构化描述处理逻辑条目是数据字典里最容易被偷懒的一项。很多人画完图只写“加工1入库管理”就交差等于什么都没写。处理逻辑要写清楚三个东西输入数据流、输出数据流、处理规则。以加工1.2“校验入库数据”为例条目项内容加工编号1.2加工名校验入库数据输入数据流入库单、采购订单输出数据流合格入库单、不合格原因处理逻辑接收入库单后与采购订单核对货物品类与数量一致则校验通过输出合格入库单不一致则输出不合格原因并退回到录入环节处理逻辑写到“业务规则”层面就够了不要往下写代码。比如“按先进先出规则扣减库存”这是业务规则“先查库存表再UPDATE数量”这是实现细节。数据字典里写了后者反而把开发实现焊死了。一个加工的处理逻辑用“接收→校验→处理→输出”的四段式来写基本不会漏。如果某个加工连一条明确的输入或输出都写不出来说明这个加工在DFD上画得多余或者分解粒度不对回头去改图。4. 数据流图与数据字典常见的五个坑从字典对不上到画成业务流程图这一章是血泪经验汇总。下面五条是我在评审仓库类系统分析文档时见到最多的问题每条按“现象→原因→解决”写可以直接对照自己的图查。4.1 图与字典对不上加了一条数据流字典里没有登记现象评审时发现0层图上有一条“库存预警”数据流从加工5指向仓库管理员但数据字典里搜不到“库存预警”这个词条。追问下去发现画图的人自己也说不出这条数据流由哪些字段组成。原因画图时随手加了一条数据流想着“最后再补字典”结果一忙就忘了同步。数据流图和数据字典是两套产物维护不同步是常态。解决画完一层图当场把这一层新增的数据流、数据存储全部登记进字典。我自己的习惯是维护一张Excel总表左边列图元素清单右边列字典条目新增一个就补一行不攒到“最后”。另外在评审前做一次反向抽查从字典里随机抽5条数据流回图上找找不到就是漏了。4.2 加工命名写“处理数据”粒度失控后没法继续分解现象0层图上出现“数据处理”“系统管理”“信息维护”这类加工名。评审时问“系统管理”里面做什么回答是“什么都有”子图也画不出来。原因拿模块名或菜单名代替加工名。加工在DFD里代表的是“对数据的处理动作”必须能说清楚它把什么数据变成什么数据。一旦写成“系统管理”动作对象全丢了自然没法继续分解。解决强制改成“动词数据宾语”结构。比如把“系统管理”拆成“维护货物档案”“维护仓库信息”“维护用户权限”把“数据处理”改成“登记入库单”“更新库存台账”。改完之后你会发现原来需要分解的加工一下子清楚了很多。如果某个加工实在找不出一个动词那它根本不是加工大概率是数据存储或外部实体被画错位置了。4.3 把判断分支画进数据流图控制流混进了数据视角现象DFD上出现菱形判断符号箭头旁边写“库存不足则……”“校验通过则……”。整张图看起来像业务流程图而不像数据流图。原因把业务流程图的画法带进了DFD。数据流图只表达“数据从哪来到哪去”不表达“先做哪个判断再做哪个动作”。判断分支是控制流属于流程图或活动图的范畴。解决把判断规则写进数据字典的处理逻辑条目DFD上只保留数据流。比如“出库校验”这个加工处理逻辑里写“库存不足时输出缺货通知库存充足时输出出库单”图上则是“出库请求”流入加工“出库单”和“缺货通知”两条数据流流出。判断本身留在字典里图面上保持干净。4.4 数据存储只写“数据库”逻辑存储和物理存储混为一谈现象数据流图上画了一个存储名字叫“数据库”或者叫“SQL Server”。这不是个例是新手最常见的问题之一。原因把物理存储介质和逻辑数据集合混在一起了。数据流图上的数据存储指的是“系统需要保存的数据集合”不是某个具体的数据库产品。解决按业务逻辑给数据存储命名并统一加D编号。仓库系统里就是D1库存台账、D2入库流水、D3出库流水、D4盘点记录。如果你在用NC、T这类成品ERP查它们自带的数据字典时也会看到按业务命名的存储比如“库存现存量表”“出入库流水账”它们的思路同样是逻辑命名只是产品替你定好了而已。4.5 有输入没输出加工不守恒还在往下画现象某个加工“盘点管理”只看得到一条“盘点单”输入没有任何输出数据流。追问输出是什么回答是“数据存到盘点记录里了”。原因画图时漏画了输出或者把“写入存储”当成了输出忘了加工还应该对外产生业务结果。在DFD里一个加工至少要有一个输入和一个输出否则就是黑洞或奇迹加工只有输入没有输出数据进去就消失了不符合守恒原则。解决逐个加工检查输入输出是否成对。以“盘点管理”为例输入是“盘点结果”输出至少要有“盘点差异表”同时写入D4盘点记录。“写入存储”在图上表现为加工指向存储的箭头但它不能替代加工对外的业务输出。这个检查做一遍很快但能拦住大量逻辑不完整的图值得在评审前逐张过。5. 从数据字典到数据库设计把条目直接映射成表和接口数据字典不是画完图、写完文档就结束的。它真正的价值在开发阶段每一个条目都能直接映射成数据库里的表和字段。这一章讲怎么把第3章的字典条目落到建表SQL和接口模块上。5.1 映射关系数据项是字段数据结构是表数据流是接口先看整体映射表后面照着执行数据字典条目数据库/代码产物说明数据项表字段类型、长度、是否可空直接沿用数据结构表或视图主表与明细表拆开时按层级拆分数据存储表命名沿用D编号对应的业务名数据流接口出入参入参DTO、出参VO按数据流组成定义外部实体角色/权限对应登录账号和操作权限处理逻辑服务方法加工编号对应servive里的方法这条映射不是严格1:1。比如第3章定义的数据结构“入库单”它既有主表字段又有明细行建表时要拆成“入库单主表”和“入库单明细表”两张表。数据字典里用{}表示的重复项落到数据库就是子表或JSON字段用[]表示的选择项落到数据库就要加一个来源类型字段。5.2 用字典条目落SQL库存台账和入库流水表的建表示例直接拿第3章的数据字典条目来建表。先看库存台账它对应D1存储条目和“库存台账”数据结构-- 库存台账表由数据字典D1直接映射 CREATE TABLE inventory_account ( item_code VARCHAR(20) NOT NULL COMMENT 货物编号, item_name VARCHAR(100) NOT NULL COMMENT 货物名称, qty INT NOT NULL DEFAULT 0 COMMENT 当前库存数量, safety_qty INT NOT NULL DEFAULT 0 COMMENT 安全库存量, location_code VARCHAR(20) NOT NULL COMMENT 库位编号, last_change_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 最近变动时间, PRIMARY KEY (item_code), KEY idx_location (location_code) ) COMMENT库存台账对应数据字典D1;字段长度直接参考字典里的格式定义“货物编号”在字典里写了格式XX-YYYY最长就是7位我留VARCHAR(20)是为了兼容未来编码规则变更属于冗余余量。qty和safety_qty用INT因为库存数量不涉及小数如果业务里有按重量出入库的场景就要改成DECIMAL。最后变更时间用TIMESTAMP加ON UPDATE省得每次更新库存还要手工维护这个字段。再看入库流水它对应D2存储条目和“入库单”数据结构。注意字典里的选择项[采购单号 | 手工入库单]在表里用一个来源类型字段表达-- 入库流水表对应数据存储D2 CREATE TABLE inbound_flow ( flow_id BIGINT AUTO_INCREMENT COMMENT 流水主键, inbound_no VARCHAR(30) NOT NULL COMMENT 入库单号, src_type TINYINT NOT NULL DEFAULT 1 COMMENT 来源1采购入库2手工入库对应字典[采购单号|手工入库单], item_code VARCHAR(20) NOT NULL COMMENT 货物编号, qty INT NOT NULL COMMENT 入库数量, unit_price DECIMAL(10,2) NULL COMMENT 单价采购入库必填、手工入库可空, warehouse_no VARCHAR(10) NOT NULL COMMENT 仓库编号, operator VARCHAR(50) NOT NULL COMMENT 经办人, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 入库时间, PRIMARY KEY (flow_id), KEY idx_inbound_no (inbound_no), KEY idx_item_code (item_code) ) COMMENT入库流水对应数据存储D2;这里要重点说两个映射细节。第一字典里“(备注)”这种可选字段映射到表里就是NULL比如unit_price在采购入库时必填、手工入库时可以不填所以它不是NOT NULL而inbound_no在字典里是必选项所以建表时必须NOT NULL。第二字典里的选择项[采购单号 | 手工入库单]不要直接建两个可空字段“采购单号”和“手工入库单”而是建一个src_type做区分再根据来源决定是否关联采购单表。5.3 加工编号变成模块清单0层图编号在后端怎么用数据流图上的加工编号不只是在文档里用一用。到了编码阶段直接把加工编号映射成后端模块和接口开发任务分配就有了依据。加工编号加工名后端模块/接口前端页面1.1录入入库单InboundController.createInbound()入库登记页1.3更新库存台账InventoryService.updateStock()服务内部方法2.1登记出库单OutboundController.createOutbound()出库登记页3.1生成盘点单StocktakeController.createStocktake()盘点单生成页5.1生成库存报表ReportController.generateInventoryReport()库存报表页这张对应表可以直接当开发任务拆分清单用。同时数据流条目里的“入库单”对应接口的入参DTO“库存报表”对应查询接口的返回VO命名保持和字典完全一致。这样做的收益在联调阶段最明显前端、后端、测试三方拿着同一份数据字典对齐字段不会出现同一个字段在接口里叫itemCode、在表里叫goods_code这种扯皮。6. 怎么验证数据流图和数据字典是否完备两遍检查法数据流图和数据字典画完别急着写代码先花一个小时做两遍检查。第一遍是正向的平衡性检查从上下文图出发逐层向下核对父子图数据流是否一致。上下文图里连到“仓库管理系统”的每一条数据流在0层图里必须能找到对应的加工0层图里每一个加工的输入输出在它的1层子图里也必须完整出现。任何一个加工有多出来的数据流都是图没画完的信号。第二遍是反向的字典检查从数据字典里随机抽10条数据流条目按“来源”和“去向”回数据流图上找。找到了看图上箭头的方向和字典写的是否一致找不到说明图漏了这条数据流。再反过来从图上随机抽10个名字回字典里查查不到就补条目。这两遍走完图和字典的对应关系基本就锁死了。最后把字典和建表SQL再对一遍字典里每个数据项在表里有没有对应字段表里每个字段在字典里能不能找到定义。我以前有一次0层图漏了“库存预警”这条数据流当时觉得不影响主流程结果做到库存模块时才发现缺了预警相关的表和字段前前后后改了三版。现在我的习惯是画完一层图就同步登记一层字典写SQL前再花一小时对一遍表结构。这套流程多花半天但能让开发阶段少加班好几个晚上。希望帮到你。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联
返回资讯列表 →