一个极简数据库设计技巧,都带着哲学

共 2763字,需浏览 6分钟

 ·

2020-12-08 10:32

点击蓝色“有关SQL”关注我哟

加个“星标”,天天与10000人一起快乐成长

图 | 榖依米


很多老读者都知道,我入行那些年,主要写 MIS 软件系统。

MIS: Management Information System 信息管理系统

当红企业管理大V,彼得德鲁克说,一切管理皆可数据化。MIS 就是数据化终结者,在企业信息的各个领域,抢风头,蹭热度。比如 MES, ERP, CRM, HR 等。

1999年开始,中国进入电商元年。阿里系的崛起,把数据库领域推向了一个个高潮。而 MIS 的繁荣也经历了无数次迭代,现在都快赶上祖师爷的辈分了。

另有一说,1997年,苏德良创办的“中国化工网”,代表了最早的电商。这且按下不表

但,要说到数据库设计,还是要从传统行业说起。毕竟,200 多年的行业管理,靠一家公司沉淀,不现实。让我们再回顾下彼得大帝的名言:一切管理皆可数据化! 将管理思想数字化, 完成开天辟地的创新,是 MIS 诞生的初衷

各位,看看肩上的担子,是不是又沉重了些。

而我们数据库工程师,要做的事情,就是去建造那些桥梁,让思想的巨人,通过健壮的桥,顺利登陆到贫瘠的蛮荒之地。没错,我们的产品,是软件,是那些桥。这些桥的好坏,强弱,都由我们控制。

关于数据库的探讨,比如什么是数据库,数据库的本质是什么,卡内基梅隆的 Andy Pavlo 老师在他的第一课,就已经做出了迄今为止最通俗的解释,“今天来上课的所有同学,你们就是一个数据库。以什么样的方式去区分你们,服务你们,就成了数据库软件”。

不愧为顶级大师,讲课深入简出,抽象之下兼顾形象。

好,言归正传,今天我要分享的话题,是数据库设计。

上面提到,数据库设计要从传统行业说起,是有原因的。传统行业的管理思维,经过多年的积累,已经沉淀了很多果实。各种数据应用方法,都已经被无数的企业验证过可靠性和便捷性。每个设计模式,都可以应用到后来的电商,社交和移动互联网。

但,好多数据库开发,看到他们设计的表结构,似乎缺少那么点对行业最佳实践的理解和敬畏。

这里有我自己的故事。之前我在电子芯片厂开发 MES 的时候,一度惊叹于 BOM (Bill of Material) 的设计。物料编码是非常有意思的一件事情。公司用 6 个年轻人来负责给公司的原材料,半成品以及产品编码。一个物料编码的产生,需要经过测试系统的验证,审批,财务系统的核实,最终才能引入到正式 MES 中来。

当时公司有位财务小姐姐,姓萧,东财硕士毕业,管理 SAP 财务模块,工作 4 年多。是 CFO 钦点财务经理候选人。乍一看,这位小姐姐完全符合我对财务的想象,穿着有品,正襟危坐,金丝边眼镜后面,藏着斤斤计较的眸子。唯一让我惊讶的,就是她的亲和力,极高。她来说点事,要点数据,莫名其妙的我都会答应。

有一次,她找我建个物料系,需要给 286 个产品编码,目的是核算这些产品的成本。给的 PD 上,产品从 1 到 286 硬编码。我咯噔了下,一个念想一闪而过,如果要在其中一个产品后,再连续地加几个产品,已得到编码的产品,肯定要往下移几行,这样编码就要错位。搞不好,多加几次,得重复调整好几遍。

但因为是这位萧姐姐下的指令,肯定没错吧,就顺了她。也就没细想,也没敢去问。

从 excel 导入后,自动生成的有序列,就成了这个物料系的编码,分分钟安排。一封邮件给萧姓姐姐发了去,上面只有两个字和一串 SQL 代码。两个字是“搞定”,SQL代码就是简单的 SELECT * FROM XXX.

萧姐姐倒也回得挺快,“多谢。你再帮我多加 8 个物料号,放在第198行的产品下面”。

啪啪打脸,是不是。当时,当场,我就晕菜。心想,“不会吧,物料编码竟然这么随意,这回放198行下面,下次,是不是放258行下面。等全部做完,数据都进来了,你再要从中间加,这些物料数据不是全废了。”

这次,我不发邮件了。直接去萧姐姐办公室,把我的想法说了出来。物料编号修改成本过高,有弄脏数据的风险。一听风险,小姐姐眼睛瞬间瞪圆,立正了2秒,一改原来原来苦口婆心的坚持,表示这是最后一次修改,在反复核查后,才发现漏了几个中间产品。

嗯,这理由也算合理,于是我照做,又把数据重新导了一遍。

邮件通知完,心想这下总消停了。准备喝个咖啡,摸会鱼。好景不长,萧姐姐电话又来了,“我要增加一列,产品类别,按照类别和物料编码可以排序,类别 A 对于1-100物料号,类别 B 对应 101 - 200 物料号,剩下的物料号归档到类别C。下班前能给我弄好吗?”

“噢,我争取啊”嘴上虽应了句,但眼睛里却感到一丝丝火辣,仿佛前面的大草原上,弼马温赶着千万头野马,奔腾而过。马儿溅起的尘灰,落满我双眼,沙沙地疼

这么玩的嘛,完全不按规则啊。如果按照这个编码,B 类别再加10个产品,我还得问 C 去借,这么一来,完全被你给卡死了。每次都要重新划分,完全拍脑袋式的动态规划,啥时候是头?

“你看了没,昨天奥巴马放了好几个大招,几天A股疯涨”,生产部的老陈,摇晃着他的肥头大耳走过来,就像一只胖头鱼。

他这么一说,我才回过神,今天A股指数破极有可能破3000点。两重仓股,就像烫手山芋,魂牵梦萦,忍不住还是打开了大智慧。当敲完最后一串 002186, 突然被像被胖头鱼手里的晶硅棒落地时发出清脆的断裂声一样击醒,000是深市大盘股,002是中小股,600是沪A股,这样编码似乎用在我们物料编码中,也极其合适。

你看,假设产品编码总共 6 位数字。产品A类别,我用100来做前缀,剩下三位数字,从0到999,可以容纳1000个产品,B类别,用200来做前缀,C类别,用300来做前缀,这样又可以分别产生1000个产品编码,还可以满足从类别上排序,相同类别下,按产品编码继续排序。

不仅如此,任何类别间的增加物料号,完全无影响。比如在B类别下增加物料号,完全不会影响到C类别,而B类下增加物料,完全可以往后顺延,直到200999.

太棒了,心有猛虎,细嗅蔷薇。越发觉得靠谱,这A股代码简直天才设计,于是,一路小跑,几乎是冲进萧姐姐的办公室,把我的想法和盘托出。

我的故事,就到这里了。愿你们在写SQL时,时不时地刻意沉淀下思考,积累出别样的设计心得。




--完--





往期精彩:


本号精华合集(三)

如何写好 5000 行的 SQL 代码

如何提高阅读 SQL 源代码的快感

我在面试数据库工程师候选人时,常问的一些题

零基础 SQL 数据库小白,从入门到精通的学习路线与书单










浏览 13
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报