一、第一范式
第一范式是最基本的范式,它要求每个表只包含一个原子性的值,即每个字段都是最小的数据单元,不可再分。第一范式的实现方法比较简单,只要将数据列中的每个字段都用单引号括起来即可。
例如,以下表中的“姓名”和“电话”字段都违反了第一范式的要求,因为姓名可以分为姓氏和名字,电话可以分为手机和座机:
sql
复制代码
表
1
:
+
------+------+
|姓名 |电话 |
+
------+------+
|张三 |
138
****
1234
|
|李四 |
139
****
5678
|
+
------+------+
要将表1改为符合第一范式的表,只需要将“姓名”字段拆分为两个字段“姓氏”和“名字”,将“电话”字段拆分为两个字段“手机”和“座机”,并用单引号括起来。
sql
复制代码
表
2
:
+
-----------+-----------+------------+
|姓氏 |名字 |手机 |座机 |
+
-----------+-----------+------------+
|张三 | |
138
****
1234
| |
|李四 | |
139
****
5678
| |
+
-----------+-----------+------------+
二、第二范式
第二范式在第一范式的基础上增加了一个约束条件:表中的每一个非主键列必须完全依赖于主键,而不是部分依赖。如果一个表有一个联合主键(由多个字段组成),那么非主键列必须依赖于整个联合主键,而不是其中的部分。
例如,以下表中的“部门”和“薪水”字段都违反了第二范式的要求,因为它们只依赖于“部门编号”列的部分值:
sql
复制代码
表
3
:
+
---------+-----------+--------+
|部门编号 |部门 |薪水 |
+
---------+-----------+--------+
|
10
|人事部 |
5000
|
|
20
|财务部 |
6000
|
+
---------+-----------+--------+
要将表3改为符合第二范式的表,可以将联合主键拆分为两个字段“部门编号”和“部门类型”,并将非主键列“薪水”依赖于整个联合主键:
sql
复制代码
表
4
:
+
-----------+--------+--------+--------+
|部门编号 |部门类型 |薪水 |员工编号 |
+
-----------+--------+--------+--------+
|
10
|人事 |
5000
|
1
|
|
20
|财务 |
6000
|
2
|
+
-----------+--------+--------+--------+