数据库Mysql数据库的三大范式1NF 2NF 3NF

Posted 宛如近在咫尺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库Mysql数据库的三大范式1NF 2NF 3NF相关的知识,希望对你有一定的参考价值。

文章目录

简述

  • 1NF:字段不可拆分
  • 2NF:有主键,非主键字段依赖主键
  • 3NF:非主键字段不能互相依赖

1NF

属性不可分割,即每个属性都是不可分割的原子项(实体中的属性即表中的列)。只要字段值还可以继续拆分,就不满足第一范式。

例如:数据表中存在address地址该属性,若每条数据的值为“xx省xx市”,则该属性即可分割属性,分为“xx省”、“xx市”两个属性。

范式设计得越详细,对某些实际操作可能会更好,但并非都有好处,需要对项目的实际情况进行设定,并非必须遵守该范式。

2NF

在满足第一范式的前提下,其他列都必须完全依赖于主键列。
如果出现不完全依赖,只可能发生在联合主键的情况下。

例如某订单表为:

-- 订单表
CREATE TABLE myorder (
    product_id INT,
    customer_id INT,
    product_name VARCHAR(20),
    customer_name VARCHAR(20),
    PRIMARY KEY (product_id, customer_id)
);

product_name 只依赖于 product_idcustomer_name 只依赖于 customer_idproduct_namecustomer_id 是没有关系的,customer_nameproduct_id 也是没有关系的。

这就不满足第二范式:其他列都必须完全依赖于主键列

需要做如下改进:

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT
);

CREATE TABLE product (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

CREATE TABLE customer (
    id INT PRIMARY KEY,
    name VARCHAR(20)
);

拆分之后,myorder 表中的 product_idcustomer_id 完全依赖于 order_id 主键,而 productcustomer 表中的其他字段又完全依赖于主键,即满足第二范式。

3NF

在满足第二范式的前提下,除了主键列之外,其他列之间不能有传递依赖关系。

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT,
    customer_phone VARCHAR(20)
);

表中的 customer_phone 有也许依赖于 customer_id ,也就不满足第三范式:其他列之间不能有传递依赖关系

改进:

CREATE TABLE myorder (
    order_id INT PRIMARY KEY,
    product_id INT,
    customer_id INT
);

CREATE TABLE customer (
    id INT PRIMARY KEY,
    name VARCHAR(20),
    phone VARCHAR(20)
);

修改后就不存在其他列之间的传递依赖关系,其他列都只依赖于主键列,满足了第三范式的设计!

面试相关

如何通俗理解三个范式?

  • 第一范式是对原子性的约束,要求属性具有原子性,不可拆分。
  • 第二范式是对记录的唯一性约束,要求具有唯一标识,即实体的唯一性
  • 第三范式是对字段冗余性的约束,即任何字段不能由其他字段派生出来

范式设计的优缺点?

  • 优点:减少数据冗余
  • 缺点:查询时需要关联多个表,更难进行索引优化

参考:
https://www.bilibili.com/video/BV1Vt411z7wy

Mysql数据库三大范式

第一范式:数据表中每一列都是不可再分割的数据项。

在一个关系表中,消除重复字段,且各字段都是最小的逻辑储存单位。
1、数据组的每个属性只可以包含一个值。
2、关系中的每个数据组必须包含相同数量的值。
3、关系中每个数据组一定不能相同。
例如:
[班级]列中不可以包含[系别]和[班级]两个属性信息。

第二范式:数据表中的每一条记录可以被唯一区分。

第二范式要求每条记录完全依赖于主键,即,不能存在不依赖主键的属性,如果出现这个情况,那么这个属性需要从表中分离出来。

例如:
(员工号+岗位) ---> 姓名、年龄、学历、基本工资、绩效工资、奖金。
可以分解为两个表:
(员工号) ---> 姓名、年龄、学历。
(岗位) ---> 基本工资、绩效工资、奖金。

第三范式:关系表中不存在非关键字对任意候选关键字列的传递函数依赖。

也就是说,第三范式要求一个关系表中不包含已在其他表中包含的非关键字信息。
所谓传递函数依赖,就是如果存在关键字A决定非关键字B,而非关键字B决定非关键字C,则称非关键字C存在传递函数依赖于关键字A。

以上是关于数据库Mysql数据库的三大范式1NF 2NF 3NF的主要内容,如果未能解决你的问题,请参考以下文章

简单记忆数据库三大范式

数据库三大范式

MySQL优化

[沫沫金原创]关系型DBMS系统三大范式一句话解读

关系型数据库设计:三大范式的通俗理解

MySQL----三大范式