数据库之范式

数据库之范式

  范式来自英文\(\text{Normal form}\),简称\(\text{NF}\)。设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入、删除和更新操作异常。反之则是乱七八糟。

  在介绍范式之前先介绍一些必要的概念。

函数依赖

  在一个关系模式R(U)下,X、Y是U的子集。若对于R(U)的任意一个关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不等,即由X可唯一确定Y,则有X函数确定Y或Y函数依赖于X,记作X→Y。

  若X→Y,并且对于X的任意一个真子集Z,都得不到Y函数依赖于X,则有Y对于X完全函数依赖,否则成Y对X部分函数依赖。若X→Y(Y→X不成立),且Y→Z,则有Z对X传递函数依赖。 (以下范式均按照个人理解给出阐述)

  候选码码是可以唯一标识关系的属性或属性组(又称为码),可从候选码中任选一个当作主码,而包含在任意一个码中的属性称为主属性,不包含在任意一个码中的属性称非主属性。

第一范式

  即\(\text{1NF}\)在关系模型中,对于数据库中的每一列均是不能再分割的。

商品编号 商品名 销售
数量/个 单价/元
1 牙膏 20 10
2 矿泉水 50 2

  如该关系即不满足第一范式,销售属性可再分,修改后如下。修改后即满足第一范式。

商品编号 商品名 销售数量/个 销售单价/元
1 牙膏 20 10
2 矿泉水 50 2

第二范式

  即\(\text{2NF}\)\(\text{2NF}\)\(\text{1NF}\)的基础上消除了非主属性对于码的部分函数依赖;如关系R(A,B,C,D),其中(A,B)→C、A→D,那么(A,B)可以唯一标识整个关系,所以(A,B)即是码,且存在非主属性D对于码(A,B)的部分函数依赖,所以它不满足第二范式,满足第一范式,所以为\(\text{1NF}\)

第三范式

  即\(\text{3NF}\)\(\text{2NF}\)\(\text{2NF}\)的基础上消除了非主属性对于码的传递函数依赖;如关系R(A,B,C),其中A→B,B→C,则码为A,存在非主属性C对于码A的传递函数依赖,所以它不满足第三范式,且满足\(\text{2NF}\),所以为\(\text{2NF}\)

\(\text{BC}\)范式

  即\(\text{BCNF}\)\(\text{BCNF}\)\(\text{3NF}\)的基础上消除了主属性对于码的传递函数依赖和部分函数依赖;如关系R(A,B,C),其中(A,B)→C,且C→A,那么显然的(A,B)、(C,B)是码,那么A、B、C均是主属性,存在主属性C对于码(A,B)的依赖,且它满足\(\text{3NF}\),所以它是\(\text{3NF}\)

待续···