一个极简数据库设计技巧,都带着哲学
点击蓝色“有关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时,时不时地刻意沉淀下思考,积累出别样的设计心得。
往期精彩: