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

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

  1. 伙伴分配器的一个极简实现

    提起buddy system相信很多人不会陌生,它是一种经典的内存分配算法,大名鼎鼎的Linux底层的内存管理用的就是它.这里不探讨内核这么复杂实现,而仅仅是将该算法抽象提取出来,同时给出一份及其简洁 ...

  2. 2数据库表增加一个字段_14个实用的数据库设计技巧!

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体. 在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证 ...

  3. 很多小伙伴不太了解ORM框架的底层原理,这不,冰河带你10分钟手撸一个极简版ORM框架(赶快收藏吧)

    大家好,我是冰河~~ 最近很多小伙伴对ORM框架的实现很感兴趣,不少读者在冰河的微信上问:冰河,你知道ORM框架是如何实现的吗?比如像MyBatis和Hibernate这种ORM框架,它们是如何实现的 ...

  4. 新鲜出炉的React博客系统源码,极简主义设计,手机端可自适应,超级简单,带部署文档与演示视频加截图

    新鲜出炉的React博客系统源码,极简主义设计,手机端可自适应,超级简单,带部署文档与演示视频加截图. 使用技术: 客户端前端:Next.js + React 管理端前端:React + Ant De ...

  5. 14 个实用的数据库设计技巧,一次性教给你!

    目录 原始单据与实体之间的关系 主键与外键 基本表的性质 范式标准 通俗地理解三个范式 要善于识别与正确处理多对多的关系 主键PK的取值方法 正确认识数据冗余 E--R图没有标准答案 视图技术在数据库 ...

  6. 14个实用的数据库设计技巧!

    作者: sirfei 来源:blog.csdn.net/sirfei/article/details/434994 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它 ...

  7. 面试: 14 个实用的数据库设计技巧,一次性教给你!

    目录 原始单据与实体之间的关系 主键与外键 基本表的性质 范式标准 通俗地理解三个范式 要善于识别与正确处理多对多的关系 主键PK的取值方法 正确认识数据冗余 E--R图没有标准答案 视图技术在数据库 ...

  8. 【经典必看】14个实用的数据库设计技巧

    戳蓝字"CSDN云计算"关注我们哦! 作者 | 程序IT圈 责编 | 阿秃 1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即 ...

  9. 14 个实用的数据库设计技巧

    点击上方"后端技术精选",选择"置顶公众号" 技术文章第一时间送达! 作者:echozh juejin.im/post/5d5b4c6951882569eb57 ...

最新文章

  1. excel重复上一步快捷键_最全的Excel快捷键合集!
  2. 程序员面试题精选100题(54)-C++/C#面试题(3)
  3. 使用IE WebControls中的TabStrip控件和MultiPage控件实现选项卡式风格页面(转载)
  4. iview给radio按钮组件加点击事件
  5. 熊猫数据集_对熊猫数据框使用逻辑比较
  6. Spring 自定义注解,配置简单日志注解
  7. 无窗口激活ActiveX控件的bug
  8. Docker集群管理之Swarm介绍
  9. 2018今日头条春招面试题
  10. 技术文档(12)-- Linux权限总结
  11. freeswitch 文件包含关系图
  12. 微信小程序Post方法提交数据
  13. arduino的L298N电机驱动模块
  14. 《Adobe Photoshop CS4中文版经典教程》目录—导读
  15. JS中函数式编程基本原理简介
  16. 【人工智能Prolog】Prolog解决数独问题
  17. 学习纯软件开发(如Java/Python...)还是C语言、嵌入式、物联网呢?
  18. Chrome的插件安装与使用
  19. 石油大P14040存在
  20. 工业交换机的单模多模是什么意思?

热门文章

  1. Cooki模拟登陆(人人网)
  2. 计算方法——C语言实现——全主元高斯消元法求解非线性方程
  3. 推荐几个在线的Linux系统
  4. 体验Linux USB 驱动
  5. class绑定多个值 vue_vue动态绑定class的几种方式
  6. 支付宝小程序开发——学习总结
  7. C语言程序——数组(1)
  8. c语言二叉树结点 深度,求二叉树的深度、总结点数和叶子结点数
  9. 决心书-- 一个对Linux懵懂无知的少年
  10. python在园林中的应用_园林景观要素在园林中的应用