大家好,又见面了,我是你们的朋友全栈君。
数据库范式(Database Normalization)
设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,还又称完美范式)。
首先要明白”范式(NF)”是什么意思。按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧?实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。
不过在设计关系型数据库时,通常只会用到前四种范式,内容相对较少,利用闲暇之余整理一下,以便记忆。这次只是提及最简单的第一范式。
第一范式(1NF)
所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。符合1NF的关系中的每个属性都不可再分。
如下表,就不符合1NF。
实际上,1NF是所有关系型数据库的最基本要求,你在关系型数据库管理系统(RDBMS),例如SQL Server,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。也就是说,只要在RDBMS中已经存在的数据表,一定是符合1NF的。如果我们要在RDBMS中表现表中的数据,就得设计为下表的形式:
通常上只要知道1NF的上述特点即可。但是为了严谨,这里举出三点不符合第一范式的例子。
不符合第一范式的情况
1、重复组(单一字段中有多个有意义的值)
重复组通常会出现在会计账上,每一笔记录可能有不定个数的值。举例来说:
顾客
日期
数量Pater
Monday
19.00,-28.20
Pater
Wednesday
-84.00
Sarah
Friday
100.00,150.00
‘数量’ 就是所谓的重复组了,而在这种情况下这份数据就不符合第一范式。想要消除重复组的话,只要把每笔记录都转化为单一记录即可:
顾客
日期
数量Pater
Monday
19.00
Pater
Monday
-28.20
Pater
Wednesday
-84.00
Sarah
Friday
100.00
Sarah
Friday
150.00
2、缺少唯一识别码
一样是在交易这个例子中,同一天同一个人买了同样的数量,这样的交易做了两次:
顾客
日期
数量Pater
Monday
19.00
Pater
Monday
19.00
如上所示,这两笔交易可以说是一模一样,也就是说如果只靠这些数据我们没有办法分辨这两笔记录。我们之所以说它不符合第一范式,是因为上面这样的表示法欠缺一个唯一识别码,可以是一个字段,也可以是一组字段,而且可以保证在这个数据中唯一识别码不会重复出现。要将它正规化到符合第一范式的原则只需要加入一个唯一识别码即可:
交易ID
顾客
日期
数量1
Pater
Monday
19.00
2
Pater
Monday
19.00
3、用很多字段来表达同一个事实
在同一个数据表里用多个字段来表达同一个事情也是违反第一范式的:
交易ID
人物
不喜欢的食物(1)
不喜欢的食物(2)
不喜欢的食物(3)1
Pater
梨子
苹果
2
Jim
西瓜
梨子
3
Airing
西瓜
苦瓜
梨子
4
Tom
老鼠
葡萄
懂得数据库基础的人一看就知道这是一个很糟糕的设计,甚至连觉得其都称不上是一个数据表。没错,其实1NF是很简单,它是所有关系型数据库设计必须要满足的基础。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142322.html原文链接:https://javaforall.cn