前言:
范式
normal form,是我们在设计数据库结构过程中所遵循的指导方法和规则。
注意:虽然越往上的范式效果越好,但表的数量会增加,导致开销增大,所以设计时要适度。通常所用到的只有前三个范式:1NF、2NF、3NF。
一般说来,数据库只需满足第三范式(3NF)就行了(符合高一级范式的设计,必定符合低一级范式)。
1. 第一范式 1NF
特点:数据表中的所有字段都是不可再分的,具有原子性。满足
1NF是所有关系型数据库的最基本要求。(当然,并不都是分得越细越好,这要根据实际情况拆分)错误示例:
mysql> select * from order1;
+------------+--------------+-------+
| product_id | product_name | total |
+------------+--------------+-------+
| 1101 | aa | 2806 |
+------------+--------------+-------+
1 row in set (0.00 sec)
- 正确示例:
//拆分数据项(字段),满足原子性
mysql> select * from order2;
+------------+--------------+----------+------------+
| product_id | product_name | quantity | unit_price |
+------------+--------------+----------+------------+
| 10001 | abc | 95 | 50 |
+------------+--------------+----------+------------+
1 row in set (0.00 sec)
2. 第二范式 2NF
特点:在满足
1NF的基础上,数据表中的记录(行)具有唯一性,并且所有的非主键字段(列)都完全依赖于主键(联合主键也是主键),消除了部分依赖。只有当数据表中的主键为联合主键时,才可能出现部分依赖的情况。错误示例:
mysql> create table myorder1(
-> product_id int,
-> customer_id int,
-> product_name varchar(20),
-> customer_name varchar(20),
-> primary key(product_id, customer_id));
Query OK, 0 rows affected (1.54 sec)
- 正确示例:
//拆表,消除部分依赖
mysql> create table myorder2(
-> order_id int primary key,
-> product_id int,
-> customer_id int);
Query OK, 0 rows affected (1.11 sec)
mysql> create table product(
-> id int primary key,
-> name varchar(20));
Query OK, 0 rows affected (0.64 sec)
mysql> create table customer(
-> id int primary key,
-> name varchar(20));
Query OK, 0 rows affected (0.82 sec)
3. 第三范式 3NF
特点:在满足
2NF的基础上,数据表中的非关键字段都不依赖于其他的非关键字段,具有独立性。即,非主键字段必须直接依赖于主键,不能存在 “A → B → 主键” 的情况(A、B为非主键字段),消除了传递依赖。错误示例:
mysql> create table myorder3(
-> order_id int primary key,
-> product_id int,
-> customer_id int,
-> customer_phone varchar(15));
Query OK, 0 rows affected (0.63 sec)
- 正确示例:
//拆表,消除传递依赖
mysql> create table myorder4(
-> order_id int primary key,
-> product_id int,
-> customer_id int);
Query OK, 0 rows affected (1.17 sec)
mysql> create table customer2(
-> id int primary key,
-> name varchar(20),
-> phone varchar(15));
Query OK, 0 rows affected (0.64 sec)
注:上述内容,部分来自于网络或书籍,仅作为学习记录使用。由于参考来源众多,未依次标明出处。若有原作者看到此文,麻烦联系本人,我会第一时间处理。我对由此给您带来的不便,深感抱歉!望见谅,谢谢!