外观
数据库的三范式是什么
数据库的三范式(3NF
)是数据库设计中用于减少数据冗余和提高数据一致性的设计原则。分别是第一范式(1NF
)、第二范式(2NF
)和第三范式(3NF
)逐步规范化的结果。以下是三范式的详细解释:
第一范式(1NF
)
定义:第一范式要求数据库表的每一列都是不可再分的原子数据项,即表中的每个字段必须是单一值,不能包含多个值或嵌套结构。
核心要点:每个字段必须是不可再分的单一值;每个字段的值必须是唯一的,不能重复;表中的每一行必须有一个唯一标识符(主键)。
举例:假设有一个学生信息表,其中包含学生姓名、课程和成绩。如果一个学生选了多门课程,不能将课程和成绩以逗号分隔的形式存储在同一个字段中,而应该将它们拆分为独立的字段,或者设计为多行记录。
不满足1NF
的情况:
学号 | 姓名 | 课程与成绩 |
---|---|---|
001 | 小羊 | 数学99, 英语33 |
满足1NF的情况:
学号 | 姓名 | 课程 | 成绩 |
---|---|---|---|
001 | 小羊 | 数学 | 99 |
001 | 小羊 | 英语 | 33 |
第二范式(2NF
)
定义:第二范式要求表必须满足第一范式(1NF
),并且表中的非主属性(非键字段)必须完全依赖于主键,而不能部分依赖于主键。
核心要点:表必须满足1NF
。如果主键是组合主键(由多个字段组成),则所有非主属性必须完全依赖于整个主键,而不能只依赖于主键的一部分。
举例:假设有一个订单表,包含订单号、客户号、客户名称、产品名称和数量。
不满足2NF
的情况:客户名称
只依赖于 客户号
,而不是整个主键(订单号 + 客户号),因此它部分依赖于主键,不满足2NF
。
订单号 | 客户号 | 客户名称 | 产品名称 | 数量 |
---|---|---|---|---|
001 | 1001 | 小羊 | 产品A | 2 |
002 | 1001 | 小羊 | 产品B | 3 |
满足2NF
的情况: 将表拆分为两个表:
客户号 | 客户名称 |
---|---|
001 | 1001 |
订单号 | 客户号 | 客户名称 | 产品名称 | 数量 |
---|---|---|---|---|
001 | 1001 | 小羊 | 产品A | 1 |
第三范式(3NF
)
定义:第三范式要求表必须满足第二范式(2NF
),并且表中的非主属性之间不能存在传递依赖关系,。
核心要点:表必须满足2NF
。非主属性之间不能存在传递依赖,即如果 A
依赖于 B
,B
依赖于 C
,则 A
不能依赖于 C
。在任一主键都可以确定所有非主键字段值的情况下,不能存在某非主键字段 A 可以获取 某非主键字段 B。
举例:假设有一个学生课程表,包含学生号、课程号、课程名称和授课教师。
不满足3NF的情况:课程名称
,课程号
和 授课教师
都依赖于 学生号
,而 课程名称
和 授课教师
也可以依赖于课程号
获得,因此不满足3NF
。
学生号 | 课程号 | 课程名称 | 授课教师 |
---|---|---|---|
001 | 1001 | 数学 | 李老师 |
满足3NF
的情况: 将表拆分为两个表:
课程号 | 课程名称 | 授课教师 |
---|---|---|
1001 | 数学 | 李老师 |
学号 | 课程号 |
---|---|
001 | 1001 |
总结:
第一范式(1NF
):原子性,确保每个字段是不可再分的原子数据项。
第二范式(2NF
):唯一性 ,消除非主键部分依赖联合主键中的部分字段,确保非主属性完全依赖于主键。
第三范式(3NF
):独立性,消除传递依赖,确保非主属性之间不存在依赖关系。
通过逐步满足三范式,可以减少数据冗余,提高数据完整性,同时简化数据库的维护和更新操作。当然 MySQL
数据库的范式不止三大范式,除了三大范式,还有巴斯-科德范式(BCNF
)、第四范式(4NF
)、第五范式(5NF
,又称“完美范式"),在实际的开发中,一般数据库的设计可能是反范式的,通过一些冗余的数据避免跨库跨表来通过空间换取时间,提高性能。