范式(数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。
满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。
第一范式
第一范式(1NF):如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF(即R符合第一范式)。简单的说,就是每一个列(属性)只有一个,没有重复。
要求
1.必须有主键来加以识别。
2.每个字段只能存放单一的值并确保有数据没有重复的组。
例如:
姓名 | 班级 | 课程 |
---|---|---|
小明 | 1班 | 数学,语文 |
小红 | 2班 | 英语 |
小明 | 2班 | 数学 |
里面还有重复组并且没有存放单一的值,并不符合第一范式,我们给其增加主键学号加以区别:
学号 | 姓名 | 班级 | 课程 |
---|---|---|---|
101 | 小明 | 1班 | 数学 |
101 | 小明 | 1班 | 语文 |
201 | 小红 | 2班 | 英语 |
202 | 小明 | 2班 | 数学 |
第二范式
首先要满足第一范式。它的规则是要求数据表里的所有数据都要和该数据表的主键有完全依赖关系。例如有表:
货物 | 供应商ID | 供应商 | 价格 | 供应商地址 |
---|---|---|---|---|
毛巾 | 01 | 世纪联华 | 10.0 | 星光大道 |
牙刷 | 01 | 世纪联华 | 5.0 | 星光大道 |
毛巾 | 02 | 十足 | 12.0 | 月光大道 |
可知,这里的主键有货物和供应商ID,价格和两个主键都有关,可是供应商地址只和供应商ID有依赖关系。那么不符合第二范式,我们可以将其修改为两张表:
供应商ID | 供应商 | 供应商地址 |
---|---|---|
01 | 世纪联华 | 星光大道 |
02 | 十足 | 月光大道 |
货物 | 供应商ID | 价格 |
---|---|---|
毛巾 | 01 | 10.0 |
牙刷 | 01 | 5.0 |
毛巾 | 01 | 12.0 |
这样就符合了第二范式要求的表内数据和表内主键完全依赖的关系。
第三范式
在第二范式的基础上,要求所有非键属性都只和候选键有相关性,也就是说非键属性之间应该是独立无关的。
从上述表来说,供应商和供应商地址是相关的,知道了供应商也就知道了供应商地址(不考虑一厂多址的情况)。可以分为:
供应商ID | 供应商 |
---|---|
01 | 世纪联华 |
02 | 十足 |
供应商ID | 供应商地址 |
---|---|
01 | 星光大道 |
02 | 月光大道 |