03 - 数据库的三大设计范式

前言:

范式normal form,是我们在设计数据库结构过程中所遵循的指导方法和规则。
注意:虽然越往上的范式效果越好,但表的数量会增加,导致开销增大,所以设计时要适度。通常所用到的只有前三个范式:1NF2NF3NF
一般说来,数据库只需满足第三范式(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)



注:上述内容,部分来自于网络或书籍,仅作为学习记录使用。由于参考来源众多,未依次标明出处。若有原作者看到此文,麻烦联系本人,我会第一时间处理。我对由此给您带来的不便,深感抱歉!望见谅,谢谢!

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容