Database: 范式的概念
范式的概念
首先,什么是范式,范式的英文是 Normal Form,其实就是标准形式的意思,就是说数据库就该设计成这样,这就是数据库的标准形式(当然,并不总是要遵守,有些时候可能需要反范式化)。
除了范式的定义,还需要先理解以下几个概念:
属性(attribute): 数据库中的字段,即数据库中表的列。
超键(super key): 在关系中能唯⼀标识元组的属性集称为关系模式的超键
候选键(candidate key): 不含有多余属性的超键称为候选键
主键(primary key): ⽤户选作元组标识的⼀个候选键称为主键
主属性(Prime Attributes / Key attributes): 候选键中的属性称为主属性。
非主属性(Non Prime attributes / Non Key attributes): 不属于任何候选键的属性称为非主属性。
外键(foreign key): 在一个表中存在的另一个表的主键称为此表的外键。
注: 前面的类比定义中对几个概念的定义是乱序的,但这样更易于理解。
有了这几个概念和它们的类比,就可以开始描述三大范式、BC范式和反范式化的概念了。
1. 第一范式(1NF)
(列要符合原子性,即表中的每个属性都不可再分)
2. 第二范式(2NF)
(非主属性必须依赖于整个主键或候选键,不能只依赖于主键或候选键的一部分属性)
若关系模式R∈1NF(即R符合第一范式),并且每一个非主属性都完全依赖于R的主码,则R∈2NF(即R符合第二范式)。
3. 第三范式(3NF)
(任何非主属性不能依赖于其他非主属性)
4. BC范式(BCNF)
(如果在关系R中,U为主键,A属性是主键的一个属性,若存在A->Y,Y为主属性,则该关系不属于BCNF)
关系模式R∈1NF。若函数依赖集合F中的所有函数依赖X→Y(Y不包含于X)的左部都包含R的任一候选键,则R∈BCNF。换言之,BCNF中的所有依赖的左部都必须包含候选键。
具有函数依赖集F的关系模式R属于BCNF的条件是,对所有F的闭包中形如
X->Y,则下面的两个条件至少有一个成立:
- X->Y是非平凡函数依赖
- X是R的一个超键。
BCNF性质
- 所有非主属性都完全函数依赖于每个候选键
- 所有主属性都完全函数依赖于每个不包含它的候选键
- 没有任何属性完全函数依赖于非候选键的任何一组属性
5. 反范式化
有时候,一味地追求符合范式,可能会导致数据库在查询时的时间开销很大、效率很低。
(反范式是一种对范式化设计的数据库的性能优化策略,通过在表中增加冗余或重复的数据来提供数据库的读取性能)