关系数据库中各种范式的连贯介绍,加入了数学表达式以帮助理解。
1. 第一范式 (1NF)
定义:确保每个字段的值是原子的,不可再分。表中的每一列都必须是单一值。
数学表达式: 每个属性 AAA 的值必须是不可分的基本数据类型。
示例: 不符合 1NF:
用户ID | 名字 | 电话 |
---|---|---|
1 | Alice | 123456, 789012 |
符合 1NF:
用户ID | 名字 | 电话 |
---|---|---|
1 | Alice | 123456 |
1 | Alice | 789012 |
2. 第二范式 (2NF)
定义:在满足 1NF 的基础上,消除部分依赖。所有非主属性必须完全依赖于主键,而不是部分依赖。
数学表达式: 对于关系 R(A1,A2,…,An)R(A_1, A_2, \ldots, A_n)R(A1,A2,…,An) 和主键 PKPKPK,如果存在 AiA_iAi 使得 AiA_iAi 仅依赖于 PKPKPK 的一部分,则不满足 2NF。
示例: 不符合 2NF:
订单ID | 产品ID | 产品名称 | 用户ID |
---|---|---|---|
1 | 101 | Apple | 1 |
1 | 102 | Banana | 1 |
符合 2NF(分为两个表): 订单表:
订单ID | 用户ID |
---|---|
1 | 1 |
产品表:
产品ID | 产品名称 |
---|---|
101 | Apple |
102 | Banana |
3. 第三范式 (3NF)
定义:在满足 2NF 的基础上,消除传递依赖。非主属性不能依赖于其他非主属性。
数学表达式: 对于关系 R(A1,A2,…,An)R(A_1, A_2, \ldots, A_n)R(A1,A2,…,An),如果存在 AiA_iAi 和 AjA_jAj 使得 AjA_jAj 依赖于 AiA_iAi,而 AiA_iAi 不是主键,则不满足 3NF。
示例: 不符合 3NF:
学生ID | 学生姓名 | 导师姓名 |
---|---|---|
1 | Alice | Dr. Smith |
符合 3NF(分为两个表): 学生表:
学生ID | 学生姓名 | 导师ID |
---|---|---|
1 | Alice | 1001 |
导师表:
导师ID | 导师姓名 |
---|---|
1001 | Dr. Smith |
4. 第四范式 (4NF)
定义:在满足 BCNF 的基础上,消除多值依赖。所有多值依赖必须依赖于超键。
数学表达式: 对于关系 R(A1,A2,…,An)R(A_1, A_2, \ldots, A_n)R(A1,A2,…,An),如果存在 AiA_iAi 和 AjA_jAj 使得 AiA_iAi 多值依赖于 AjA_jAj,且 AjA_jAj 不是超键,则不满足 4NF。
示例: 不符合 4NF:
学生ID | 课程 | 爱好 |
---|---|---|
1 | 数学 | 游泳 |
1 | 物理 | 游泳 |
1 | 数学 | 阅读 |
1 | 物理 | 阅读 |
符合 4NF(分为两个表): 课程表:
学生ID | 课程 |
---|---|
1 | 数学 |
1 | 物理 |
爱好表:
学生ID | 爱好 |
---|---|
1 | 游泳 |
1 | 阅读 |
总结
通过遵循这些范式,可以有效减少数据冗余和提高数据一致性,从而构建更可靠的关系数据库设计。虽然实际应用中可能需要在范式化和性能之间进行权衡,但了解这些范式是关系数据库设计的基础。