Skip to content
扫码开始移动端阅读

数据库范式

1743
需要≈
8.715
分钟
数据库
other

理解数据库范式:从1NF到5NF

古希腊掌握SQL的神曾经说过:

数据库范式是关系数据库设计中的核心概念,旨在减少数据冗余、解决数据异常问题。通过应用范式,可以优化数据库的存储效率,并提高数据完整性的维护能力。

1NF:第一范式 - 属性的原子性

概念

1NF强调属性的原子性约束,要求属性具有原子性,不可再分解。

优缺点

优点缺点
确保数据的基础结构可能导致数据冗余和不一致性

举例:

学生表(学号、姓名、年龄、性别、地址)。地址可以细分为国家、省份、城市、市区、街道,那么该模式就没有达到第一范式。

sql
-- 例如,存储学生信息的表结构
CREATE TABLE Student (
    student_id INT,
    name VARCHAR(100),
    age INT,
    address VARCHAR(255)
);

2NF:第二范式 - 记录的唯一性

概念

2NF在1NF的基础上,要求数据表必须有主键,且非主键字段要完全依赖于主键。

优缺点

优点缺点
减少数据冗余仍可能存在传递依赖

举例

版本表(版本编码,版本名称,产品编码,产品名称),其中主键是(版本编码,产品编码),这个场景中,数据库设计并不符合第二范式,因为产品名称只依赖于产品编码。存在部分依赖。所以,为了使其满足第二范式,可以改造成两个表:版本表(版本编码,产品编码)和产品表(产品编码,产品名称)

sql
-- 例如,存储产品版本信息的表结构
CREATE TABLE Version (
    version_code INT,
    product_code INT,
    PRIMARY KEY (version_code, product_code)
);

CREATE TABLE Product (
    product_code INT PRIMARY KEY,
    product_name VARCHAR(100)
);

3NF:第三范式 - 消除传递依赖

概念

3NF要求非主键字段必须直接依赖主键,而不能通过其他字段间接依赖。

优缺点

优点缺点
消除部分依赖和传递依赖可能导致更多的表连接,影响查询性能

举例

订单表(订单编码,顾客编码,顾客名称),其中主键是(订单编码),这个场景中,顾客编码、顾客名称都完全依赖于主键,因此符合第二范式,但顾客名称依赖于顾客编码,从而间接依赖于主键,所以不能满足第三范式。如果要满足第三范式,需要拆分为两个表:订单表(订单编码,顾客编码)和顾客表(顾客编码,顾客名称)。
说明:3NF的模式肯定满足2NF。产生冗余和异常的两个重要原因是部分依赖和传递依赖。3NF模式中不存在非主属性对码的部分函数依赖和传递函数依赖,性能较好。1NF、2NF一般不适合作为数据库模式,通常需要转换为3NF或者更高级别的范式,这种变换过程称为关系模式规范化处理。

sql
-- 例如,存储订单信息的表结构
CREATE TABLE Order (
    order_code INT PRIMARY KEY,
    customer_code INT
);

CREATE TABLE Customer (
    customer_code INT PRIMARY KEY,
    customer_name VARCHAR(100)
);

BCNF:巴克斯范式 - 修正的第三范式

概念

BCNF是对3NF的优化,确保主键的每一列都对其他列具有完全函数依赖。属于修正的第三范式,是防止主键的某一列会依赖于主键的其他列。当3NF消除了主属性对码的部分函数依赖和传递函数依赖称为BCNF。

特性

1、所有主属性对每一个码都是完全函数依赖
2、所有主属性对每一个不包含它的码,也是完全函数依赖
3、没有任何属性完全函数依赖与非码的任何一组属性

优缺点

优点缺点
消除复杂的依赖关系实现复杂度较高,可能导致性能下降

举例

库存表(仓库名,管理员名,商品名,数量),主键为(仓库名,管理员名,商品名),这是满足前面三个范式的,但是仓库名和管理员名之间存在依赖关系,因此删除某一个仓库,会导致管理员也被删除,这样就不满足BCNF。

sql
-- 例如,存储库存信息的表结构
CREATE TABLE Inventory (
    warehouse_name VARCHAR(100),
    manager_name VARCHAR(100),
    product_name VARCHAR(100),
    quantity INT,
    PRIMARY KEY (warehouse_name, manager_name, product_name)
);

4NF:第四范式 - 消除多值依赖

概念

4NF非主属性不应该有多值。如果有多值就违反了第四范式。4NF是限制关系模式的属性间不允许有非平凡且非函数依赖的多值依赖。

优缺点

优点缺点
消除多值依赖,减少数据冗余设计复杂,适用场景有限

举例

用户联系方式表(用户id,固定电话,移动电话),其中用户id是主键,这个满足了BCNF,但是一个用户有可能会有多个固定电话或者多个移动电话,那么这种设计就不合理,应该改为(用户id,联系方式类型,电话号码)。

sql
-- 例如,存储用户联系方式的表结构
CREATE TABLE ContactInfo (
    user_id INT,
    contact_type VARCHAR(50),
    contact_number VARCHAR(100),
    PRIMARY KEY (user_id, contact_type, contact_number)
);

🌟 5NF:第五范式 - 消除连接依赖

概念

5NF是数据库范式的最终形态,进一步消除了连接依赖,确保每张表都能分解为更小的表,且这些表在逻辑上与原始表拥有相同的主键。

优缺点

优点缺点
实现数据的最高规范化实现复杂,通常不适用于实际应用

TIP

由于5NF非常复杂,通常不需要实现具体的SQL,实际应用中也很少用到


总结

范式优点缺点适用场景评分(满分5)
1NF简单、基础数据冗余基本设计⭐⭐⭐
2NF减少冗余可能有传递依赖大多数场景⭐⭐⭐⭐
3NF消除传递依赖查询性能可能下降更复杂的设计⭐⭐⭐⭐
BCNF消除复杂依赖设计复杂度高需要高规范的场景⭐⭐⭐⭐
4NF消除多值依赖适用场景有限特殊场景⭐⭐⭐
5NF最高规范化实现复杂,不常用几乎不使用⭐⭐

通过对比各个范式的优缺点,可以看出,3NF和BCNF是实际开发中最常用的范式,它们在减少数据冗余和维护数据完整性方面表现优异。而对于4NF和5NF,则主要适用于特定的高规范化场景。希望这篇文章能帮助你更好地理解数据库范式,并在实际项目中灵活运用! 🎉

上次更新: