ESAP达摩院 思想有多远,我们就能走多远

系统工程师之路|都2020年了,你还不会SQL?

2020-01-12

前提

不管是刚接触类EXCEL开发平台的新手,还是在各种此类平台中摸爬滚打很久的老鸟,如果到2020年了还不会SQL,那就非常有必要看一看此文。

前提是,你立志要开发维护好一套企业级系统工程(system project),而不是三五个模板就能搞定的简单应用(simple application)。

什么是SQL

SQL,指结构化查询语言,全称是 Structured Query Language,是用于访问和处理数据库的标准的计算机语言。

为什么是SQL

关系数据库是久经验证的工业通用存储标准,而企业级系统工程必然涉及大量数据存储,这些数据的存取都需要用SQL。

选择哪种SQL

互联网类企业像阿里巴巴喜欢用Mysql,成本低。

银行、金融类企业更青睐Oracle,成本高,安全度高。

普通企业一般用Mssql,成本和安全性居中。例如金蝶,用友,类EXCEL开发平台等。

为什么要会SQL

在《ESAP高级教程-深入系统架构》一文中,村长举了一个非常经典的例子,就是在开发仓库库存系统时,如果用SQL思维:即先开表,再做模板。那么可以节省大量库存计算视图代码。

学会SQL后,开发人员会慢慢培养出一种“表感”。就像我们学车后,通过不断驾驶会形成的“车感”一样,能清楚感知自己的汽车走在哪条线上,即使松开方向盘一会也不会跑偏。

对数据库的“表感”也一样,它能逐步强化我们对整个系统数据架构的统筹和掌控力。好的数据架构能有效抵抗新需求的撕扯,不会因此陷入无限重构的困境。

举个例子,我们先开三组核心原始表,再做两组视图,就形成了进销存核心架构。

接下来只要做好销售订单、销售出库、销售收款、采购订单、采购入库、采购付款,系统就基本成型了。所有模板表都映射到三个原始表,待办查询统一利用相关视图。

这个时候客户可能会说,我们还有委外订单,要加委外模块。不要慌,先不要急于画新模板,我们先分析一下委外模块需求:委外订单,委外入库单,委外对账单,委外付款单。

从SQL角度,委外模块几乎就是采购模块的翻版,只是叫法不同,所以我们只需要复制采购模块的各个模板,改一下模板名即可,甚至连提数公式,数据规范都不用动就可以了。这就是架构的力量,以不变应万变!

进击的SQL

在《ESAP高级教程-动态换算的奥义》中,村长展示了如何在提数中使用自定义函数来一劳永逸解决动态换算问题。

事实上,这是非常重要的高级技能,数据库不再仅仅是存储载体,还能主动出击,进行编程,生产数据。

  • 在MRP计算中,我们会用到SQL存储过程,甚至会用到游标,例如在计算完一行工单需求后,要先增加工单库存占用,再计算下一个工单,再增加工单库存占用。

  • 在一些特殊的场合,我们会用到触发器,保证数据绝对严谨和安全。

通常来说,服务器带宽是稀缺的,CPU是过剩的,所以一般情况下不需要担心这些SQL计算给服务器带来压力。更多情况是,很多时候我们的服务器是阿里云、腾讯云等云主机,带宽非常有限,那么将大量数据下载到客户端,再通过js/vba等前端脚本计算,再返回数据库是得不偿失的。

举个最经典的例子:关账。

很多新手的关账模块非常费劲,先做个模板,把大量结存明细提过来,再保存,甚至还要回写“期初表”,回写锁定已结单据……

然而,真实情况是,这些统统没有必要,关账你只需要做一个按钮,用户按下这个按钮会执行一个SQL存储过程,自动结转期初,并锁定相关单据。

最后的防线

系统本质是什么?

是数据。

就像我们玩的王者荣耀一样,我们玩的就是数据,那些HP,MP,攻击力,防御力等等,就是存在某个服务器的数据库的某个表的某一行的数值,我们每天通过游戏客户端在不断维护这一行的数值!有时我们下载打开另外一个新游戏,会感觉这个游戏模式好熟悉。没错,这些个游戏的数据架构很可能是一样的,只是美工不同,数据库里存的都是HP100,只是界面上一个叫“貂蝉”,一个叫“九尾妖狐”而已!

所以系统工程最重要的就是后端数据,游戏数据是玩家氪金的源泉,生产数据是企业发展的动力。

前端是可以换的,换成H5+Css3+Js(如HZG)也好,换成Excel+vba(如ES/NX)也罢。

深圳有许多系统供应商,他们的前端每天都在外包,而后端算法和数据则牢牢掌握在自己手里。

我们把思绪收回来,回到信息化系统工程的本质。

当我们的数据量积累到一定程度时就需要做查询性能优化,这个时候说不懂SQL很可能就是一步死棋。

年初的时候,村长一个跑了8年的ES案例,因为客户更换服务器,竟然出现很多模板打不开了。

这些模板在老服务器上运行时又立马恢复正常,通过对服务器硬件的分析,村长得出的结论是这次更换服务器其实是“硬件降级”,新服务器性能不如老服务器,但是客户也没有更多的硬件升级计划了。所以解决问题,不能靠砸钱解决,而要靠技术。

通过SQL Server Profiler监视分析,村长发现模板打开时执行的某个提数非常慢,这个提数的数据源涉及几百万行,毕竟运行了8年,实属正常。

通过增加主键和索引,最终这个查询从一分钟降到了2秒。原本的全表扫描变成了索引扫描,只需要扫描2万行即可。

事情并没有结束,因为另外一些模板即使加了索引,仍然不能打开,例如有一个最新单价相关的提数跑了半个小时也没出结果。

最终村长重写了算法,秒出结果。

从上面这个例子,我们至少可以得出两个结论:

  • 性能不够硬件来凑,好的服务器确实可以抵挡一大波潜在问题。

  • 硬件不够,技术来救,学会SQL,就是解决问题的最后防线,因为这个时候数据根本到不了前端,就算h5+css3+js也好,Excel+vba也罢,再牛逼上天也救不了。

写在最后

我们经常说“低代码”开发,而不是“无代码”开发,你可以不懂js,可以不懂vba,但SQL非懂不可,严格来说,SQL也不算编程。

都2020年了,如果还有人跟你吹嘘说他开发了一套牛逼的系统,但他不会SQL,叫你也不要学,请立即拉黑吧,这种人不是蠢就是坏!

最后,祝大家新年快乐。

2020-1-12


近似文章