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

点击蓝色“有关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 数据库小白,从入门到精通的学习路线与书单

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dbLenis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值