数据库设计是一项看似简单但是门道儿很深的工作。
简单:数据库设计就是设计表,设计表的字段。
门道儿:数据库设计的四(六)个阶段、三(五)种范式等等。
本系列以某学校的学生成绩数据为例,介绍数据库的六种范式。
1、范式
范式(Normal Form)就是前人通过理论和实践总结出来的标准形式,是数据库设计的基本依据。
公认的五种范式包括1NF、2NF、3NF、4NF、5NF,还有名称比较特殊的
Boyce-Codd范式,简称BCNF,可以看作3NF的升级版(3.5NF)。
五种范式的关系是层层递进的,一层比一层更严格,满足NF2的一定满足NF1,满足NF3的一定满足NF2,依次类推。
2、NOSQL
某学校需要“存储”各院系学生的成绩,小A设计了一张表STUDENT,只包括一个字段INFO,字段中包含院系、姓名、成绩三种信息,用冒号标识,用逗号隔开。
这样的设计已经满足了学校“存储”学生成绩的需求,每个人的信息都按一定格式准确的保存在STUDENT表中。
这样的数据库设计中属于key-value型的NOSQL数据库设计,这里不展开。
3、1NF
在成绩存储好后,张三要查询自己的成绩,他需要:
(1)select info from student where info like '%张三%'
(2)得到INFO字段——“院系:日文系,姓名:张三,成绩:98”
(3)在INFO字段中找到成绩对应的数字——98
显然这非常不方便,因为所有的信息都混到一起了。
小B说:为什么不把院系、姓名和成绩分开呢?于是小B设计了下表:
这样张三查成绩可以直接这样:
这张表就符合了上述1NF范式的定义:每个属性都不可再分。
4、关系型数据库
通俗的理解:每个字段都包含单一数据,而非多类数据。DEPART只存储院系名称,STUDENT只存储学生姓名,SCORE只存储学生成绩。
进一步的理解:所谓的“不可再分”是相对的概念。在这个例子中,STUDENT存储的是学生的全名,可以满足查询需求。但如果有新的需求,例如要查找所有姓氏为“张”的学生成绩,学生姓名就是“可再分”的:
分成FIRSTNAME和LASTNAME两部分,对应的,“张三”也要以“张”和“三”分别存储。
深层的理解:符合1NF范式的,才是关系型数据库(二维表数据库),而类似key-value形式的数据库属于非关系型数据库(NOSQL)。
5、总结
本文简要介绍了数据库范式,并以实例介绍了1NF范式。
1NF,非常简单的概念,简直不值一提。
但是数学大厦也是在1+1=2之上建立起来的。
数据库范式系列之二——NF2!敬请期待。
领取专属 10元无门槛券
私享最新 技术干货