[E0-02]数据库思维

[E0-02]数据库思维

天依然蓝着,没心没肺。
知了依然叫着,撕心裂肺。
马路依然拥挤,繁华和你的孤单和谐相处。
打开微博纵览天下大事,打开知乎和各路精英谈笑风声,刷完微信的所有小红点你收获满满。合上手机你依然为今晚吃麻辣烫还是酸辣粉焦虑。
生活不好不坏,教程不早不晚不紧不慢持续更新着。
放下家国情怀人工智能货币政策房价涨跌,一起做点小事儿吧。比如收回狂乱思绪继续学习EXCEL:)
好消息是,我们逐步开始脱虚向实,硬的咯牙的fuck goods(干货)说来就来。呐,这篇就是。

1.定义问题

We already walked too far, down to we had forgotten why embarked.
不要因为走得太远,而忘记为什么出发。

任何思维方法论都是有场景的,牛顿的三大力学定律再牛,放到疯狂的股市投机市场照样会感叹“我能看懂星球的运转,却看不懂人性的疯狂”(大意)。之后托腮沉思皈依我佛,30岁之后就没提出啥牛逼的科研成绩了。可见思维场景有多重要。
同样,数据库思维的应用场景先要从EXCEL的不同数据表类型说起。
如果你拿EXCEL是用来当记事本写写字用的,好走不送,拜拜了您。
如果你准备用EXCEL存储数据,那么,你要知道EXCEL数据表实际分两种:

  • 报表型数据表。这种表格的典型特点是数据表本身已经是最终输出结果,数据是用来给人阅读的,所以这种表格是可以完全没有定式没有定法的,各种配色,合并单元格,斜线标题,看你心情随便上,没有任何问题。针对报表型数据表的任何改动唯一需要考虑的除了数据准确性以外,就是阅读者的体验。典型的报表型数据表如学生课程表(打印出来放在写字台上用),公司财报(面向投资者提供信息),工资条(供员工核对工资信息)。
  • 数据源型数据表。这种表格的典型特点是数据本身不是最终结果,是用来供后续计算分析加工的,比如套用公式、生成数据透视表、排序筛选、图形化绘制等等。因为要高效准确完成后续加工过程,所以我们就要对数据源提一些规范化要求。

这篇文章要聊的问题核心是:针对数据源型数据表,我们都要那些规范化要求,以及这些要求背后的原因是什么?

2.何谓数据库

先来看看官方定义(来自维基百科wikipedia.org):

数据库,简单来说可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据运行新增、截取、更新、删除等操作。
数据库指的是以一定方式储存在一起、能为多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合。

学习数据库需要掌握哪些知识点呢,看下图(点击图片后可放大显示):

好啦,快合上你张大的嘴巴,我是吓你的。你只需要读懂下面几句话:

  • 典型的数据库是关系型数据库,最简单的关系型数据库可以理解为一张结构化二维表格。
  • 什么是结构化二维表格?有列(或者叫标题,列标题,是一个意思)有行(至少有一行数据)就是二维表格。如果对每一列数据都进行了完整定义,那就是结构化二维表格。
    我知道你还是一脸懵逼,少啰嗦,看例子。
    先看一张貌似平淡的数据表:

这是一张常见的学生信息表,横向有行,竖向有列,是二维表,没有问题。
问题是如何结构化?结构化是如何体现的?
我们再看一张图:

看出点儿门道没?这张字段定义表给刚才那张学生信息表加了限制,分别从列标题(数据库中通常称为字段,后文不做特别说明的话,列标题字段是一个意思)名称、类型、长度、是否为空做了详细限定。比如:

  • 编号列,一串数字,最大的用处就是用来唯一确定一个学生的,一个学生只有一个编号,一个编号只对应一个学生。这种特定的字段在数据库中通常命名为ID列,往往数字本身是没有特别含义的,最大的用处就是一个值就能唯一确定一行数据,这就是数据库中主键(key)的含义,标定特定的一行数据用。
  • 姓名、年龄、出生日期列。类型基本都看得懂吧基本上和EXCEL单元格格式类型一样的,不过这里多了一个限制:不能为空,这样就确保这些列的任意一行都是有数据的。想想看,EXCEL对数据的要求是很松散的,数据库是很严格的。
  • 颜值、是否毕业列。可以为空,从字面意思也可以大致理解含义。这种列往往对核心数据的影响一般,有了我就处理或显示,没有也行。

小结一下:针对二维数据表每一列都严格定义了约束条件的就是结构化数据表,一个或多个结构化数据表组成的文件就是数据库。

3.数据库实例

最简单的例子当属EXCEL的同门师兄ACCESS了,为了让这部分的例子不太无聊,我们开个脑洞,设想一个场景。克莱登大学著名学渣“慕容富贵”(不用怀疑,这么奇葩混搭的名字我是故意这样取的)喜欢著名学霸“诸葛狗剩”(这名字也够辛辣吧),慕容先生通过贿赂机房看门的王大爷搞到了学校管理的学生数据库数据,目前能够看到的信息是两张表,分别是学生信息表和选课信息表。数据库和数据表的大致关系以及数据表字段定义如下图所示(点击图片后可放大显示):

我们看上图,最右侧的两张截图定义了字段约束和类型信息,很容易看明白吧。注意一下学生信息表的学生编号旁边有个小钥匙图表,这个意思就是这个字段是主键,能够唯一标识所在行数据的。下面的选课信息表为什么有两个小钥匙图标呢?因为一个课程可以被多个学生选,一个学生也可以选多个课程,只有学生+课程组合在一起才能唯一标识一行记录。
我们再来看两张表的实际内容(点击图片后可放大显示):

首先看学生信息表,狗剩姑娘(好奇怪)的颜值是美若天仙,富贵小伙子没写颜值,没写……我懂了,应该不是最丑吧只能说。
再看选课信息表,注意,选课信息表的学生信息部分没有使用学生姓名而是编号,想想为什么?第一,解决了重名信息错乱问题。第二,在两张表之间建立了准确的相互引用关系。第一句话很好理解。第二句话,通过这种表格设计,我们很容易拿到各种综合查询数据。比如,列出选了高数的美若天仙的学生清单,列出狗剩姑娘都选了哪些课程等,都是一句话(SQL语句)的事情。
等一下,我们再看看第二张表,第一行第二行,第三行第四行的学生编号分别都是重复的对不对?注意,尽管重复,数据库是没有合并单元格概念的,重复就重复,大量不合适的重复通过改善表结构设计来规避,绝不允许合并单元格操作。
顺便提一句,通过上表我们发现,狗剩姑娘选了高数和建筑两门课程,嗯,书香门第的清雅姑娘。富贵同学选了生理卫生和养猪理论两门课程,哎呀我去,一股屌丝气息铺面而来,别追人家姑娘了,好好养你的猪去吧。

4.数据库思维启示录

所谓数据库思维,就是借鉴数据库对数据表的设计要求,来改善和理解EXCEL中数据源型数据表的相关规范
注意,数据库思维是两层意思。一层是理解,原来不太明白的结合数据库很容易明白;一层是改善,结合数据库要求更好的规范EXCEL数据表。
这部分我们先讲整体层面的思考结论,下一节看实操。

表格上方不要出现表标题

  • 第一,数据库表设计从来没有表标题的概念,更加不可能在数据区域出现表标题;
  • 第二,表标题占用了列标题行,会对后续分析造成很大的干扰;
  • 第三,表标题信息可以体现在sheet名称中。

数据表设计要有唯一标识列

或者叫缺少主键字段,或者叫缺少ID列,一个意思。
为什么会有这个建议,只是为了单纯模仿数据库?不是的,有实际意义。

  • 保证你对源数据可以随时恢复的能力。不管你是排序筛选各种对行顺序的折腾,最后只要按照ID列做一次排序就回来了。
  • 大幅度减少查询难度。我们知道EXCEL对查询的支持时比较弱的(和数据库比查询简直没法比),通过添加ID列并且让ID列放在最左边应用VLOOKUP取数据会简单很多。
  • 作为辅助列配合工具将复杂多列二维表转化为简单列二维表,这种做法的细节后文会详述。
  • 养成一个每行有唯一标识字段的良好意识。相信我,很多困扰使用者的重名问题,多条件查询问题,逆序查询问题,往往一个ID列就可以解决。

不要在原始数据表中增加任何汇总或合计行

  • 根据原因是,这样做会破坏原来结构化的数据分布,让部分数据不再是规整的了,想想看如果在学生信息表的最后一行加一个学生总数=110的汇总,那这个110到底是属于哪个现有字段的?

不要合并单元格

同样的,这会破坏表结构,正确的做法是,让数据重复。保持数据适当重复时完全可以接受的,还记得前文提到的课程信息表吗?一个学生可以选择多个课程,所以学生编号重复是很正常的。
换个角度看,数据库里根本就没有合并单元格这个概念。
引申一下,斜线表头是相同道理,都是被禁止的。

不要空行空列

很简单,空行空列也许在视觉上没有问题,但在计算上会有各种问题。随便举个例子,空字段将直接导致数据透视表行标签出现空白标签。

工作表与工作簿规划

一个工作表(SHEET页)用来描述一个对象,(比如学生信息,比如学生选课信息),一个工作簿(EXCEL文件)用来描述一类数据(比如学生基础信息)。适当控制工作表之间的引用,绝对不要产生工作簿之间的引用。

字段内容原子化

每个字段的内容一定是不能再分了,比如数量如果内容是“35个”这就不是原子化,一定还能分成两列分别是数量和单位。
为什么有这个要求?一个原因是,数据库包括EXCEL中,对分散数据的拼接比准确拆分容易的多;另一个原因是,含有数量的非原子化内容比如“35个”将使得数据失去可计算性;第三个原因,原子化意味着大家都是一个粒度的(反正都已经拆到不能再拆了),而非原子化则可能有各种程度的粒度,这对数据之间的引用是非常不利的。

相同内容统一表述

比如班级名称,在所有地方同一个班级都应该是相同的表述,“天物强化班”和“天体物理学班”不应该同时出现,软件会认为是两个班级。EXCEL中应该使用数据验证下拉框规范此类问题。

特殊格式字段格式要满足格式要求

比如日期时间字段,不能既有中文又有英文,既有-又有\,这都不规范。

每列数据类型保持一致

想想看,数据表设计的时候,每列数据是不是天然一致的,比如出生日期列类型是日期,那该列数据要么是一个具体日期要么空着,绝不允许出现“不记得啦”,“丑年寅时”这种内容。

禁止空格换行等非可见字符破坏数据本身

很简单,不管是在EXCEL眼里,还是在任何一个数据库系统眼里,“西门”和“西 门”(中间加了空格)都是不同的数据,这些不可见字符会是定时炸弹,表现出各种莫名其妙的问题。比如你检索“西门”就无法检索带空格的那条记录。
有的同学喜欢ALT+ENTER强制换行或者使用空格将人名对齐,这都是不可取的。

不要批注

这一条估计不少人不太理解。我的看法是,批注内容在数据内容上是不可见的,输入的信息有没有关键信息也是不知道的,如果确实需要批准宁可建一列数据列叫做批注或者备注。

5.数据库思维实操

好,口说无凭,上文提到的那些“要与不要”你真的掌握了吗?我做了一个表作为反面典型,见下图。先不看我后面的说明,你自己来想一想这张表都有哪些不合规范的地方。

以下是思考时间






思考结束

我们先来梳理以下这张表整体存在的问题(下文问题列表需要和上图数字部分是一致的):

  • 1.表格上方不要有表标题
  • 2.字段对齐不要用空格
  • 3.年龄列没有原子化
  • 4.日期列输入数据不统一不规范
  • 5.字段内容不符合列字段定义且使用了强制换行
  • 6.期末成绩列字段内容混乱不统一
  • 7.不要合并单元格
  • 8.不要出现空行
  • 9.不要斜线表头
  • 10.不要批注信息
  • 11.“生物化学班”和第一行的“生化班”实质内容相同,表述不一致。
    你找全了猜对了吗?

6.朴实的就是最好的

回到问题本身,到底什么数据是EXCEL喜欢的?
我的答案是,结构化的,类别统一的,最接近数据库表样式的就是最好的。

  • 第一行是标题行。风雨无阻,第一行一定是标题行。
  • 第一列是ID列。尽管不是强制要求,但我强烈建议你这么做。
  • 每列数据不可拆分,已经原子化。每列数据类型相同,格式规范。
  • 拒绝合并单元格,拒绝斜线表头,拒绝空行空列。
  • 没有空行空列。

看看下图(标题部分不是数据表区域,别误会),简简单单的数据库表,就是最好的EXCEL数据源表了。

今日儿童节,愿你不失好奇,永远少年。
有任何反馈,随时欢迎反馈。
感谢阅读,如能转发,感谢加倍。

推荐阅读更多精彩内容