一个极简数据库设计技巧,都带着哲学
点击蓝色“有关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 数据库小白,从入门到精通的学习路线与书单
一个极简数据库设计技巧,都带着哲学相关推荐
- 伙伴分配器的一个极简实现
提起buddy system相信很多人不会陌生,它是一种经典的内存分配算法,大名鼎鼎的Linux底层的内存管理用的就是它.这里不探讨内核这么复杂实现,而仅仅是将该算法抽象提取出来,同时给出一份及其简洁 ...
- 2数据库表增加一个字段_14个实用的数据库设计技巧!
1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体. 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证 ...
- 很多小伙伴不太了解ORM框架的底层原理,这不,冰河带你10分钟手撸一个极简版ORM框架(赶快收藏吧)
大家好,我是冰河~~ 最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernate这种ORM框架,它们是如何实现的 ...
- 新鲜出炉的React博客系统源码,极简主义设计,手机端可自适应,超级简单,带部署文档与演示视频加截图
新鲜出炉的React博客系统源码,极简主义设计,手机端可自适应,超级简单,带部署文档与演示视频加截图. 使用技术: 客户端前端:Next.js + React 管理端前端:React + Ant De ...
- 14 个实用的数据库设计技巧,一次性教给你!
目录 原始单据与实体之间的关系 主键与外键 基本表的性质 范式标准 通俗地理解三个范式 要善于识别与正确处理多对多的关系 主键PK的取值方法 正确认识数据冗余 E--R图没有标准答案 视图技术在数据库 ...
- 14个实用的数据库设计技巧!
作者: sirfei 来源:blog.csdn.net/sirfei/article/details/434994 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它 ...
- 面试: 14 个实用的数据库设计技巧,一次性教给你!
目录 原始单据与实体之间的关系 主键与外键 基本表的性质 范式标准 通俗地理解三个范式 要善于识别与正确处理多对多的关系 主键PK的取值方法 正确认识数据冗余 E--R图没有标准答案 视图技术在数据库 ...
- 【经典必看】14个实用的数据库设计技巧
戳蓝字"CSDN云计算"关注我们哦! 作者 | 程序IT圈 责编 | 阿秃 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即 ...
- 14 个实用的数据库设计技巧
点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:echozh juejin.im/post/5d5b4c6951882569eb57 ...
最新文章
- excel重复上一步快捷键_最全的Excel快捷键合集!
- 程序员面试题精选100题(54)-C++/C#面试题(3)
- 使用IE WebControls中的TabStrip控件和MultiPage控件实现选项卡式风格页面(转载)
- iview给radio按钮组件加点击事件
- 熊猫数据集_对熊猫数据框使用逻辑比较
- Spring 自定义注解,配置简单日志注解
- 无窗口激活ActiveX控件的bug
- Docker集群管理之Swarm介绍
- 2018今日头条春招面试题
- 技术文档(12)-- Linux权限总结
- freeswitch 文件包含关系图
- 微信小程序Post方法提交数据
- arduino的L298N电机驱动模块
- 《Adobe Photoshop CS4中文版经典教程》目录—导读
- JS中函数式编程基本原理简介
- 【人工智能Prolog】Prolog解决数独问题
- 学习纯软件开发(如Java/Python...)还是C语言、嵌入式、物联网呢?
- Chrome的插件安装与使用
- 石油大P14040存在
- 工业交换机的单模多模是什么意思?