简介:面向ERP系统学习与开发者的数据库表结构参考文档,覆盖销售预测、销售订单、主生产计划(MPS)、物料需求计划(MRP)、物料清单、工作中心、工艺路线、能力需求计划、采购、库存、车间任务等核心模块,并涵盖报表生成与查询、界面输入等完整功能菜单。文档详细列出各数据表的字段定义,如物料编码、物料名称、安全库存量、批量规则、计划展望期、需求时界、计划时界、提前期、合格率、可用库存量、净需求量、计划产出量、可供销售量等,同时梳理主表与从表、界面输入表之间的对应关系,可帮助理解ERP从销售预测到生产计划再到采购库存的完整数据流,适合课程设计、毕业设计或系统开发前期的数据库建模参考。压缩包内含1个doc文件,整体大小约30KB,打开即可阅读。已有480人学习查看,兼具实用性与参考价值。
1. 一份ERP数据库设计文档:从销售预测到库存盘点的近二十张核心表
这份ERP数据库设计文档,最值钱的地方不是它有多少张表,而是它把制造企业里最难设计的MPS主生产计划、MRP物料需求计划、CRP能力需求计划这三套计划体系,连同销售、采购、生产、库存十几张核心表的字段一次给全了。做过ERP相关项目的人都知道,进销存单据表好设计,一到计划类报表就容易卡壳,时区时段怎么切、毛需求净需求怎么算、主表和从表怎么分工,没有一个现成的字段级参考,光靠自己想非常容易翻车。这份文档正好能把这块补上。适合正在做制造业信息化项目、需要做数据库课程设计,或者想从零搭一套ERP原型结构的人参考照着设计。
2. 数据主线怎么走:从销售预测、销售订单到MPS、MRP的字段流转
拿到这份文档,第一件事不是看字段,而是先把它的业务主线捋出来。因为这份文档里每一个菜单、每一张表都不是孤立的,它们之间是按“预测→计划→执行→库存”的顺序串起来的。
2.1 先看懂业务主线:七个阶段、十几张表构成一张网
我把文档里的核心表按业务阶段整理了一下,这张表基本就是制造业ERP的骨架:
| 业务阶段 | 入口菜单 | 核心表 | 输出 |
|---|---|---|---|
| 销售预测 | 销售管理 | 销售预测单 | 预测量、预测日期区间 |
| 销售接单 | 销售管理 | 销售订单 | 订单量、交货日期、客户 |
| 主生产计划 | MPS管理 | MPS报表主表、从表 | 计划产出量、计划投入量 |
| 物料需求 | MRP管理 | MRP报表主表、从表、物料清单 | 净需求量、采购/加工建议 |
| 能力校验 | CRP管理 | 能力需求计划报表、工作中心、工艺路线 | 负荷量、能力负荷差 |
| 采购执行 | 采购管理 | 采购申请单、采购订单 | 采购数量、到货日期 |
| 生产执行 | 生产管理 | 车间任务单、加工单/派工单 | 开工/完工日期 |
| 库存闭环 | 库存管理 | 入库单、出库单、库存盘点单 | 库存数量、盈亏金额 |
顺着这张表看,业务的源头是销售预测单和销售订单。销售预测给的是未来一段时间的预测量,销售订单给的是已经确认的订单量。MPS报表生成时,主表提供物料级的计划参数,从表按时间段展开数量,算完主生产计划,再靠物料清单一层层展开成MRP的净需求,最后落到采购申请和生产任务。CRP则用工作中心、工艺路线这两个数据维护表里的产能数据,反过来校验计划排得合不合理。整条链路闭环,且每张单据都能往上下游追溯。
2.2 主表与从表为什么非要拆成两张
文档里MPS和MRP都设计了报表主表和报表从表,这是整个数据库设计里最值得学习的地方。先说主表,它的字段是物料编码、物料名称、安全库存量、前期库存量、批量规则、批量、计划展望期、需求时界、计划时界、提前期、合格率、计划员编码、计划编制日期。这些字段有一个共同特点,它们都是“一个物料一行”的静态参数,描述这个物料怎么备料、怎么排产。从表则完全不同,它的字段是时区、时段、日期、预测量、订单量、毛需求量、计划接受量、可用库存量、净需求量、计划产出量、计划投入量、可供销售量,这些字段是“一个物料一行可以拆成N个时段”的动态数字。
主表和从表分离是ERP计划类报表的标准做法。MPS生成时,先读主表拿到物料参数,然后按计划展望期把时间轴切成若干时段写入从表,一个物料对应多行时段记录。这样设计有两个明显好处:一是查询的时候,主表连从表一次就能把物料参数和时段数据都带出来;二是统计报表的时候,按从表的时区、时段字段做分组聚合非常方便,不需要在主表里反复折腾。做数据库设计时如果图省事把主表和从表合成一张宽表,时段一多,字段冗余和更新异常立刻就来了。
2.3 界面输入与报表字段共用:MRP怎么复用MPS的字段
文档里有一处细节容易被忽略,MRP界面输入的物料需求计划报表主表,字段都包含在主生产计划报表主表里;MRP从表的字段,也都包含在MPS从表里。也就是说,设计者没有为MRP单独再造一套表,而是直接复用了MPS的主表和从表,只是在界面输入层做了字段裁剪。MRP主表只暴露物料编码、物料名称、安全库存量、批量规则、批量、计划展望期、提前期、合格率、计划员编码、计划编制日期这些物料级参数,把前期库存量、需求时界、计划时界这几个MPS特有的字段藏掉了;从表也只在界面上保留时段、日期、毛需求量、计划接受量、可用库存量、净需求量、计划产出量、计划投入量,把预测量、订单量、可供销售量这些MPS视角的字段隐藏掉。
这个做法在物理表层面很有价值,MRP和MPS共用一套主从表,数据维护成本低,同一套物料档案不需要在两个模块里各存一份。但这也带来一个隐患,MPS和MRP共用物理表后,两套菜单写同一张表,如果角色权限和操作范围控制不到位,很容易串数据。常见做法是主表加一个“计划类型”字段区分MPS和MRP,或者在应用层为不同角色配置字段级权限,比如MRP操作界面里把需求时界、计划时界设置为只读,防止计划员在MRP界面误改MPS参数。这一块我会在避坑章节里详细展开。
3. MPS与MRP的关键参数:展望期、时界、批量规则定不对,计划全是噪声
很多照着这份文档做数据库设计的人,表建好了、字段填上了,但MPS报表生成出来就是不对。问题往往不在表结构,而在主表里那三个时间参数和一个数量参数没搞清楚。这一章把它们的含义和推算顺序掰开讲透。
3.1 计划展望期、需求时界、计划时界:三个时段参数的真实含义
MPS主表里的计划展望期、需求时界、计划时界,是一组联动的时间参数,它们直接决定了从表里时段怎么切、预测量和订单量各起什么作用。
| 参数 | 含义 | 一般取值 | 影响 |
|---|---|---|---|
| 计划展望期 | MPS计划覆盖的总时长 | 30到90天 | 决定从表要展开多少个时段 |
| 需求时界 | 该时间点以内只认订单量 | 等于关键物料累计提前期 | 需求时界内预测不参与计算 |
| 计划时界 | 该时间点以内计划冻结 | 一周左右 | 时界内不允许随意调整计划 |
需求时界是最容易理解错的参数。它的逻辑是:在需求时界以内的日期,MPS只认销售订单量,不再看预测单的预测量;在需求时界以外的日期,预测量和订单量取较大值参与计算。原因是需求时界内的需求已经临近交付,预测已经没有意义,只能以客户确认的订单为准。如果把需求时界设成0或者不维护,MPS就会把预测单里所有的预测量全部当成硬需求,计划产出量被顶得很高,采购也跟着多买,这是最典型的翻车场景。计划时界则是给计划一个冻结窗口,窗口内不轻易调整,避免计划员反复改计划导致车间和采购无所适从。
3.2 毛需求、净需求、计划产出与投入:从表字段的推算顺序
MPS报表从表里的字段,不是让人随便填的,它们之间存在严格的递推关系。常见做法是按下面的顺序计算,这个顺序也是报表生成程序的主逻辑:
- 第一步,确定毛需求量。需求时界内取订单量,需求时界外取预测量与订单量较大值,填入从表的毛需求量字段。
- 第二步,计算可用库存量。可用库存量等于前期库存量加计划接受量,再减去毛需求量。注意这里的前期库存量来自主表,计划接受量来自从表同一时段或上一时段。
- 第三步,计算净需求量。净需求量等于毛需求量减去前期库存量减去计划接受量,再加上安全库存量。如果结算结果小于等于0,净需求量按0处理。
- 第四步,按批量规则调整。净需求量不是最终的计划产出量,要按主表里的批量规则和批量值向上取整,得到计划产出量。
- 第五步,按提前期倒推计划投入量。计划投入日期等于计划产出日期减去提前期,计划投入量等于计划产出量除以合格率。合格率这个字段在这里就开始起作用。
我举个例子。某物料毛需求量是120,前期库存量是20,计划接受量是30,安全库存量是10。净需求量等于120减去20减去30再加上10,结果是80。假设主表批量规则是固定批量、批量为100,那计划产出量就不是80而是100。如果合格率是95%,计划投入量就等于100除以0.95,约等于105.27,然后把这个数量排到产出日期往前推提前期的那一天。主表里的合格率字段看似不起眼,到了这个计算环节,数量差就出来了。
3.3 批量规则与均化类型:小字段决定计划是平顺还是剧烈波动
MPS主表里的批量规则,常见有直接批量、固定批量、期间批量三种。直接批量是净需求多少就产出多少,适合单价高、加工费占比大的物料;固定批量是每次都按一个固定数量投产,适合模具、热处理这类有最小起订量的工序;期间批量是把某一段时间内的净需求合并成一批,适合需求相对平稳的物料。如果批量规则不初始化,全部走直接批量,计划产出量会跟着净需求剧烈跳动,今天排80件、明天断供、后天又排120件,供应商和车间都没法干活。
销售预测单里有个均化类型字段,同样影响MPS的毛需求分布。均化类型的含义是,预测数量在起始日期到结束日期这个区间内怎么摊开。常见做法有按日均化、按周均化、按月均化。举例来说,预测数量是300,起始日期到结束日期一共30天,按日均化就是每天10。如果均化类型设置不对,300全部落在起始日期这一天,毛需求量第一天就爆出一个大尖峰,MPS会为了让这一天产能跟上而排出一大笔计划投入,后面的时段反而空着。这个字段和计划展望期配合着用,才能让预测需求在时间轴上平顺展开。
4. 从计划到执行:工艺路线、工作中心、CRP能力校验与工单拆解
计划算完只是第一步,能不能落地还要看产能和工序。这份文档里,工作中心信息表、工艺路线表、能力需求计划报表、车间任务单、加工单和派工单就是干这件事的。这一章讲清楚这几张表怎么联动。
4.1 工作中心与工艺路线:能力数据从哪来
工作中心信息表的字段是工作中心代码、工作中心名称、车间代码、班次、每班小时数、每班平均人数、设备数。这是典型的产能主数据。一个工作中心的有效产能,常见计算公式是班次乘以每班小时数乘以每班平均人数再乘以设备数。比如一个工作中心一天2班、每班8小时、每班平均2人、4台设备,日产能就是2乘8乘2乘4,等于128工时。这里的人员和设备是并行系数,如果设备是自动化的,人员只是看管,那每班平均人数可以按设备数的比例折算。工作中心信息表里的班次和每班小时数,是CRP报表里“加工能力”字段的数据来源。
工艺路线表的字段是物料号、工序号、工序名称、工作中心名称、加工时间单位、加工时间。这张表描述的是“这个物料按什么顺序经过哪些工作中心、每道工序花多长时间”。物料号关联到物料主数据,工序号决定加工顺序,工作中心名称关联到工作中心信息表,加工时间单位这个字段特别容易被忽略。如果一条工艺路线里,有的工序加工时间单位是小时,有的工序是分钟,到了CRP计算环节,负荷量会成倍出错。后面避坑章节我会专门讲这个坑。
4.2 CRP报表的负荷计算方式与字段口径
能力需求计划报表的字段是工作中心代码、时段、日期、负荷量、加工能力、能力负荷差、累计能力负荷差。负荷量是把MPS/MRP算出来的计划投入量,套到工艺路线上展开得到的。展开逻辑是:每个物料在某个时段的计划投入量,乘以该物料各道工序的加工时间,然后把同一个工作中心下所有物料的负荷累加起来,得到这个工作中心在该时段的负荷量。加工能力则是工作中心信息表算出来的有效产能。能力负荷差等于加工能力减去负荷量,负值表示超载,正值表示有富余。累计能力负荷差是从第一个时段到当前时段的逐段累加,用来判断整个展望期内这个工作中心是持续超载还是阶段性超载。
CRP的计算只看两点就够:一是负荷量不能超过加工能力,二是累计能力负荷差不能长期为负。实际跑CRP报表时,通常先把MPS/MRP的产出计划按提前期展开到每个时段,再按物料关联工艺路线,按工作中心聚合负荷。文档里CRP管理菜单只有CRP报表生成和CRP报表查询,没有单独的CRP基本信息表,说明CRP的输入完全复用MPS/MRP的计划数据和数据维护里的工作中心、工艺路线数据。这也符合常规设计:能力需求计划本来就不该有自己独立的业务单据,它就是计划和产能两张数据碰出来的校验结果。
4.3 车间任务单、加工单、派工单:三级工单的拆解逻辑
生产管理菜单里的车间任务单、加工单/派工单,是计划落到车间现场的三个层次。车间任务单的字段是任务编码、物料编码、物料名称、计划开工日期、计划完工日期、车间代码。它回答的问题是“做什么、做多少、什么时候做完、在哪个车间做”。加工单和派工单则进一步细化到工序级,字段是物料编码、物料名称、工序号、工作中心代码、计划开工日期、计划完工日期、优先级、实际完工日期。加工单可以看成任务单拆出来的第一道工序,派工单是加工单再往工作中心分配。优先级字段一般是数字,数字越小越先排产,这个字段在工单积压时特别有用。
实际完工日期这个字段很关键。它表面上是记录一道工序什么时候干完,实际上是生产完工管理的反馈入口。车间报工的时候,实际完工日期一填,系统就能据此更新库存和后续工序的计划开工日期。如果数据库设计时漏掉这个字段,整个生产执行链路就断了。我在做类似项目时,一般会在加工单/派工单上额外加上合格数量、报废数量两个字段,用于完工入库和成本核算,这份文档虽然没有列出来,但实际落地时值得补上。
4.4 采购请购、出入库与盘点:单据状态怎么留
采购管理菜单里,生成请购单对应采购申请单,采购订单管理对应采购订单,采购到货管理则对应采购订单里的计划到货日期和实际到货日期。采购申请单的字段是物料编码、物料名称、规格型号、计量单位、数量、单价、金额、需求日期、申请部门、业务员、申请日期。这里的需求日期很关键,它应该直接来源于MRP算出来的净需求日期,否则采购容易买早了或买晚了。采购订单比采购申请单多了计划到货日期、实际到货日期、订购日期、客户名称。采购订单里带客户名称,常见于受托加工或者直发客户的场景,普通采购下单时这个字段留空即可,这说明文档里的字段设计是宽口径的,宁可多放几个字段给特殊业务用,也不让流程跑一半缺字段。
库存管理菜单的入库单、出库单、库存盘点单,是业务闭环的最后一段。入库单的入库类型是产品入库、原材料入库、在制品入库三类,出库单的出库类型是产品销售、原材料领料、在制品领料三类。这两张单据结构几乎一样,都是单号、日期、类型、仓库、物料、数量、单价、金额,区别只在类型字段的枚举值。库存盘点单则用账面数量、账面金额和实际数量、实际金额算出盈亏数量、盈亏金额。盘点时最怕边盘点边出入库,数据一直在变,所以通常的做法是盘点前冻结库存,盘点单上记录盘点日期,以盘点日期为界区分账务。
5. 避坑:计划对不上、BOM重复计算、能力负荷为负的五个真因
这一章把我在实际用这类ERP表结构时遇到过的五类高发问题列出来,每一条都是踩过坑才总结出来的。
5.1 时界设置不当:MPS算出大量无效预测需求
现象:MPS报表生成后,计划产出量明显偏高,采购申请单数量也跟着失控,而车间实际根本没有那么多订单。 原因:需求时界没有维护或者设成了0。需求时界的本意是时界以内只认销售订单、不认预测,设成0后系统把所有预测需求全部当成有效需求参与计算,等于把预测单当成了订单单。 解决:把需求时界设为关键物料的最长累计提前期,比如采购周期最久的原材料需要30天,需求时界就设30天。计划时界设成一周左右的冻结窗口,窗口内不允许计划员随意改计划。代码里判断逻辑要写清楚:日期在需求时界内取订单量,日期在需求时界外取预测量与订单量的较大值。
5.2 批量规则空白:净需求等于毛需求,计划投入量乱跳
现象:净需求80,计划产出量也是80,没有按批量合并。生产订单忽多忽少,供应商没法提前备料。 原因:MPS主表里的批量规则字段为空或者默认了直接批量。直接批量意味着净需求多少就产出多少,系统不帮你做任何数量合并。 解决:上线前把物料主数据里的批量规则初始化一遍。固定批量适合有最小起订量的工序,期间批量适合需求平稳的物料。建表时给批量规则字段设一个非空默认值,比如默认直接批量,避免出现NULL值;更推荐在上线数据准备阶段,按物料分类把批量规则和批量值一次配好。
5.3 BOM层次号手填:MRP展开低层码错乱重复计算
现象:同一个物料在A产品的BOM里是第1层,在B产品的BOM里是第3层,MRP展开时这个物料的需求被重复计算或者展开深度错乱。 原因:物料清单表里的层次号被当成人工录入字段了。层次号的正确语义是低层码,即该物料在所有BOM结构中出现的最低层数,它应该由系统按母件展开深度自动计算,人工手填必错。 解决:插入BOM记录时,系统先算母件自身展开到该物料的最深层级,再把其写进层次号字段。层次号只是MRP展开时用来控制展开顺序的辅助字段,不应该设计成可人工维护的输入项。这个坑在数据维护菜单录入物料清单表时特别容易踩,录入人员图省事随便填个1,后期计划就乱了。
5.4 加工时间单位混用:CRP负荷量虚高,能力负荷差永远为负
现象:能力需求计划报表跑出来后,工作中心的能力负荷差长期为负,报表显示天天超载,但车间实际产能是富余的。 原因:工艺路线表里的加工时间单位字段没有被统一。一条工艺路线里,第一道工序写的是小时、第二道工序写的是分钟,CRP计算负荷量时没做单位换算,直接把数字累加,负荷量就会虚高好几倍。 解决:工艺路线录入界面强制加工时间单位统一为小时,或者做一道单位折算逻辑:分钟除以60换成小时后再参与负荷量计算。建议在全流程上线前跑一次工艺路线数据检查,把加工时间单位不一致的工艺路线全部捞出来整改,这个动作我每次做项目都会强制执行。
5.5 MPS与MRP共用主表:两套菜单写同一张表,查询结果串数据
现象:MPS报表查询结果里混着MRP的数据,或者计划员在MRP界面改物料参数,MPS的计划跟着变了。 原因:文档里MRP界面输入的物料需求计划报表主表,字段包含在MPS主表里,物理上共用一张表是省事了,但两套菜单都往同一张表里写,缺少区分标识和字段级权限控制。 解决:给MPS主表增加一个“计划类型”字段,MPS菜单和MRP菜单分别按计划类型读写数据;同时对MRP操作界面做字段级权限控制,把需求时界、计划时界、前期库存量这些MPS特有的参数置灰只读,防止MRP界面误改MPS数据。如果项目里有多套角色同时在线操作,建议再补充操作日志表,记录谁在什么时间改了哪个计划参数,方便事后排查。
6. 落地技巧:先把物料主数据定住,再动计划单据
拿到这份文档想快速落地,最容易踩的坑是上来就建MPS主表、MRS从表,建完发现物料基础数据没定,所有计划报表都是脏数据。我的习惯是先做物料主数据。
为什么先把物料主数据定住?因为整份文档里几乎每张表都以物料编码为关联键。销售预测单、销售订单、MPS主表、物料清单、采购申请单、生产任务单,全部挂物料编码。物料编码的规则、长度、是否大写了,一乱全乱。物料主数据表建议按下面的结构建:
CREATE TABLE t_material ( material_code VARCHAR(20) NOT NULL COMMENT '物料编码', material_name VARCHAR(100) NOT NULL COMMENT '物料名称', spec_model VARCHAR(100) COMMENT '规格型号', unit VARCHAR(10) NOT NULL COMMENT '计量单位', safety_stock DECIMAL(18,3) DEFAULT 0 COMMENT '安全库存量', batch_rule TINYINT DEFAULT 0 COMMENT '批量规则:0直接 1固定 2期间', batch_qty DECIMAL(18,3) DEFAULT 0 COMMENT '批量', lead_time INT DEFAULT 0 COMMENT '提前期,单位:天', yield_rate DECIMAL(5,4) DEFAULT 1 COMMENT '合格率,0.95表示95%', planner_code VARCHAR(20) COMMENT '计划员编码', PRIMARY KEY (material_code) ) COMMENT '物料主数据表';这段SQL里的几个细节是长期积累下来的习惯。物料编码用VARCHAR(20)而不是直接主键用自增ID,因为业务上要求物料编码可读、可追溯,20个字符足够覆盖绝大部分制造企业的编码规则。计量单位用VARCHAR(10),避免出现太长的单位描述。安全库存量、批量、数量类字段统一用DECIMAL(18,3),金额类字段统一用DECIMAL(18,2),这样数量不会因为精度不够而出现小数点丢失,金额也不会出现四舍五入对不上账的问题。合格率用DECIMAL(5,4),最大能表示9.9999,足够覆盖正常生产场景。
物料主数据建完,接下来才按业务顺序建BOM表、工作中心信息表、工艺路线表,再建销售订单、采购订单这些单据表,最后建MPS、MRP的报表主表和从表。整套表建完后,还有一步初始化不能省:把批量规则、需求时界、计划时界这些计划参数在物料主数据里预置好,不要等报表生成了再补。之前做门窗厂的MES项目,我直接照着一份类似的字段清单设计了计划表,结果物料主数据编码规则没定,报表跑了三周全是重复物料和乱码,后来花了大力气清洗。从那以后,我每次做ERP落地都强制要求先定物料编码规则和BOM展开规则,再碰计划表。按这个顺序走一遍,这份文档里的表结构基本就能稳稳落地,希望帮到你。
本文还有配套的精品资源,点击获取