本文源自村长多年的ERP架构经验!
模板式架构
在正式谈系统架构思想之前,我们先回顾一下自己的第一套ES类系统设计是什么样的?
ES官方教程第一篇是订单,所以大部分玩家第一个模板可能是销售订单
,定义了销售订单_主表
,销售订单_明细
。
然后呢?可能是销售出库单
,定义了销售出库单_主表
,销售出库单_明细
。
好了,接下来大概率是采购订单
,定义了采购订单_主表
,采购订单_明细
。
不出意外的话,后面跟着采购入库单
,定义了采购入库单_主表
,采购入库单_明细
。
深入一点的还会有生产订单
,定义了生产订单_主表
,生产订单_明细
。
与之匹配的是生产入库单
,定义了生产入库单_主表
,生产入库单_明细
,
以及生产领料单
,定义了生产领料单_主表
,生产领料单_明细
。
好了,一个进销存系统主体模板基本完成。
这是典型的先模板,再开表
的架构模式。
架构问题
举例一个经典问题是库存计算,通常为了回避回写带来的不确定性,中小系统可以采用视图计算库存,年结来切割数据。
视图代码示例如下:
select 品号,库存=sum(入)-sum(出) from (
select 品号,入=数量,出=0 from 采购入库单_明细
union all
select 品号,入=数量,出=0 from 生产入库单_明细
union all
select 品号,入=0,出=数量 from 销售出库单_明细
union all
select 品号,入=0,出=数量 from 生产领料单_明细
) io group by 品号
这种架构最大的问题就是一旦增加了模板,或模板增加了字段,或增加了统计维度,就要改视图代码。
例如公司又新开发了注塑车间和包装车间的相关个性单据,可能代码要改成下面这样:
select 品号,库存=sum(入)-sum(出) from (
select 品号,入=数量,出=0 from 采购入库单_明细
union all
select 品号,入=数量,出=0 from 生产入库单_明细
union all
select 品号,入=数量,出=0 from 注塑入库单_明细
union all
select 品号,入=数量,出=0 from 包装入库单_明细
union all
select 品号,入=0,出=数量 from 销售出库单_明细
union all
select 品号,入=0,出=数量 from 生产领料单_明细
) io group by 品号
又例如公司开始对批次有管理要求,我们不但要把所有收发单据模板改一遍,加上批号
字段,还要改sql:
select 品号,批号,库存=sum(入)-sum(出) from (
select 品号,批号,入=数量,出=0 from 采购入库单_明细
union all
select 品号,批号,入=数量,出=0 from 生产入库单_明细
union all
select 品号,批号,入=数量,出=0 from 注塑入库单_明细
union all
select 品号,批号,入=数量,出=0 from 包装入库单_明细
union all
select 品号,批号,入=0,出=数量 from 销售出库单_明细
union all
select 品号,批号,入=0,出=数量 from 生产领料单_明细
) io group by 品号,批号
不但如此,我们还要修改相关列表规范,增加字段,修改相关引用模板,增加填充字段。任何一个新需求,都几乎要把整个系统全部翻修一遍。
如果有一天公司做大了,收购了一堆公司,那简直要改得筋疲力尽,两眼发黑…
数据库式架构
如果我们换一种思路,从数据库角度出发去开发模板,即先开表,再模板
模式,一切会变得不同。
先开表,把可能需要的字段都预先定义好,保证未来数据表本身变动最少。
例如设计收发表,把需要的和可能需要的字段都塞进去。
然后定义:收发主表
,收发明细
。
接下来,只要是出入库单类模板,都映射
到这两个表,根据需要取舍字段,不一定要全部一一映射。
这样,无论我们怎么增加新的相类似模板,视图代码永远是:
select 品号,批次,库存=sum(收)-sum(发) from 收发明细 group by 品号,批次
事实上,全球著名的SAP也是把订单都视为订单
对象,所有销售,采购,生产等订单都继承自这个对象。
因此,我们可以把订单表也做后台统一,唯一的区别就是类型=销售/采购/生产
这样做的好处是,只需要一个视图就可以完成所有订单收发查询了。
深挖映射价值
很明显,映射在提数和回写方面都能节省大量设计维护工作量。
映射的本质是多模板共用一套数据表,形成多头蛇
效果,无论通过哪个模板填报都能把数据存到一起。
反过来,映射也可以把数据库已有的数据以不同的方式展示给用户,也就是SAP中的用户视图
,所谓用户视图并不是SQL视图,而是根据权限等要求,系统对不同的用户展示不同的数据。
例如,商品表中通常含有单价,通常这些敏感信息我们不希望仓管看见,但仓管又必须能查询其他商品信息。
EXCEL类平台要解决权限不同,用户视图不同一般有三种方案:
1.使用模板本身的字段权限设置,不同用户隐藏不同的字段。缺点是:图片
,附件
不受约束。
2.另外建一个纯查询模板,提数显示需要的信息。缺点是:工作台没法用。
3.使用映射模板,这是在JU/NX中才可用的方案,ES不行,ES的映射模板在工作台不能相互显示数据。
第三种方案具体的操作方法选择原商品表,右键-复制新增,修改新增的模板名称,将数据表映射到原商品表,删除不要的单价,附件等字段,设置权限仅仓管可见,原模板设置仓管不可见。
这种方案使仓管可以在工作台看到商品表,但又完全没有其他不相干的字段,本身也不需要设置提数公式,是最简洁有效的方案。
无单价模板效果示例:
小贴士:一般的,使用映射表后,建立列表等规范时,选择原始模板表,可以避免数据规范因业务变动删模板失效。
小结
本文旨在拓展映射技术的应用思维,本文涉及的数据库备份可在聚慧禅院中下载。
最后,村长祝愿大家在新的一年里工作顺利,心想事成,爱生活,爱宝贝^_^。
2019-03-06