数据库范式是一系列规范条件的集合,这些规范条件定义了数据库表结构的合理性,以减少数据冗余和改善数据的逻辑结构。主要的范式包括第一范式(1NF)、第二范式(2NF)、第三范式(3NF)和巴斯-科德范式(BCNF)。每个高级范式都建立在前一个范式的基础上。
定义:一个表的每个列都不可再分,且每列中的数据都是原子数据项。
示例:
学号 | 姓名 | 课程 |
---|---|---|
S001 | 张三 | 数据库管理, 计算机网络 |
不满足1NF,因为“课程”这一列中含有多个课程名称,可再分。
调整后:
学号 | 姓名 | 课程 |
---|---|---|
S001 | 张三 | 数据库管理 |
S001 | 张三 | 计算机网络 |
定义:在1NF的基础上,消除了非主属性对于码的部分函数依赖。
示例:
学号 | 课程 | 成绩 | 教师 |
---|---|---|---|
S001 | 数据库管理 | 90 | 李四 |
S001 | 计算机网络 | 85 | 王五 |
假设学号+课程是主键,成绩和教师是非主属性,不存在非主属性对主键的部分依赖,因此满足2NF。
定义:在2NF的基础上,消除了非主属性对于码的传递函数依赖。
示例:
学号 | 课程 | 成绩 | 教师ID | 教师名 |
---|---|---|---|---|
S001 | 数据库管理 | 90 | T01 | 李四 |
S001 | 计算机网络 | 85 | T02 | 王五 |
假设教师名依赖于教师ID,而教师ID依赖于学号+课程(主键),存在传递依赖。需要将表分解。
调整后:
学生课程表:
学号 | 课程 | 成绩 | 教师ID |
---|---|---|---|
S001 | 数据库管理 | 90 | T01 |
S001 | 计算机网络 | 85 | T02 |
教师表:
教师ID | 教师名 |
---|---|
T01 | 李四 |
T02 | 王五 |
定义:在3NF的基础上,消除了主属性对码的部分或传递函数依赖。
示例:
假设存在一个表:
学号 | 课程代码 | 课程名称 | 教师 |
---|---|---|---|
S001 | C01 | 数据库管理 | 李四 |
S001 | C02 | 计算机网络 | 王五 |
如果“课程代码”决定了“课程名称”和“教师”,则存在主属性对主键的依赖(即课程代码对学号+课程代码的依赖),违反了BCNF。
调整后分为两个表:
学生课程表:
学号 | 课程代码 |
---|---|
S001 | C01 |
S001 | C02 |
课程信息表:
课程代码 | 课程名称 | 教师 |
---|---|---|
C01 | 数据库管理 | 李四 |
C02 | 计算机网络 | 王五 |
满足2NF