一、AI 讲解
数据库设计的范式是一组规则,用于指导如何组织数据库中的数据,以提高数据的逻辑一致性、减少数据冗余和提高数据操作的效率。下面我将通过几个范式的定义和示例来进行讲解。
第一范式(1NF)
定义: 数据库表中的所有字段值都是不可分割的原子值。换句话说,表的每列都是不可再分的数据项,每个字段中存储的是基本的数据项,不能再包含多个值,即实现字段的原子性。
示例:
不符合1NF的表:
学号 | 姓名 | 课程 |
---|---|---|
001 | 张三 | 数学, 英语 |
002 | 李四 | 物理, 化学, 生物 |
转换为符合1NF的表:
学号 | 姓名 | 课程 |
---|---|---|
001 | 张三 | 数学 |
001 | 张三 | 英语 |
002 | 李四 | 物理 |
002 | 李四 | 化学 |
002 | 李四 | 生物 |
第二范式(2NF)
定义: 在第一范式的基础上,非主属性完全依赖于主键。即表中的非主键字段必须完全依赖于主键,不能只依赖于主键的一部分(针对于组合主键)。
示例:
不符合2NF的表(已符合1NF):
学号 | 课程代码 | 分数 | 课程名称 |
---|---|---|---|
001 | MATH101 | 85 | 数学 |
001 | ENG102 | 90 | 英语 |
这里“课程名称”依赖于“课程代码”,而不是完全依赖于主键(学号 课程代码)。
转换为符合2NF的表:
学生表:
学号 | 课程代码 | 分数 |
---|---|---|
001 | MATH101 | 85 |
001 | ENG102 | 90 |
课程表:
课程代码 | 课程名称 |
---|---|
MATH101 | 数学 |
ENG102 | 英语 |
第三范式(3NF)
定义: 在第二范式的基础上,非主属性不依赖于其他非主属性,即除了主键之外的字段必须相互独立。
示例:
不符合3NF的表(已符合2NF):
学号 | 课程代码 | 分数 | 教师姓名 | 教师电话 |
---|---|---|---|---|
001 | MATH101 | 85 | 王老师 | 123456 |
002 | ENG102 | 90 | 李老师 | 654321 |
这里“教师电话”依赖于“教师姓名”,而不是依赖于主键。
转换为符合3NF的表:
学生课程表:
学号 | 课程代码 | 分数 |
---|---|---|
001 | MATH101 | 85 |
002 | ENG102 | 90 |
教师表:
教师姓名 | 教师电话 |
---|---|
王老师 | 123456 |
李老师 | 654321 |
以上就是数据库设计中的三个基本范式,通过这些范式的应用,可以有效地规范数据库设计,减少数据冗余,提高数据的一致性和可维护性。接下来,我会出几道相关的选择题。
二、AI 出题
- 下列哪项描述符合第一范式(1NF)的要求? A. 表中的每个字段都可以有重复的值 B. 表中的每个字段值都是可分割的 C. 表中的每个字段值都是不可分割的原子值 D. 表中可以存在重复的记录
- 在数据库范式中,如果一个表要满足第二范式(2NF),它首先必须满足: A. 第三范式(3NF) B. 第一范式(1NF) C. BCNF D. 第四范式(4NF)
- 关于第三范式(3NF)的描述,下列哪项是正确的? A. 非主属性可以依赖于其他非主属性 B. 任何非主属性都不能依赖于其他非主属性 C. 只要满足了2NF就自然满足3NF D. 主键中的每个键都可以依赖于非主属性
- 假设有一个学生选课系统的数据库表,其中包含“学号”、“课程名称”和“成绩”三个字段。为了使这个表达到第一范式(1NF),必须保证: A. 每个学生只能选一门课 B. “课程名称”字段中可以包含多个课程名称 C. “成绩”字段中不能包含多个成绩值 D. “学号”字段必须是唯一的
- 以下哪个例子不符合第二范式(2NF)? A. 学生表,其中包括学生ID、姓名和年龄 B. 课程表,其中包括课程ID、课程名称和学分 C. 成绩表,其中包括学生ID、课程ID、分数和课程名称 D. 教师表,其中包括教师ID、姓名和所授课程ID
- 如果一个表已经满足第三范式(3NF),下列哪项是一定成立的? A. 表中不可能存在任何传递依赖 B. 表中一定存在部分依赖 C. 表中一定存在冗余数据 D. 表中一定包含组合主键
答案:
- C. 表中的每个字段值都是不可分割的原子值
- B. 第一范式(1NF)
- B. 任何非主属性都不能依赖于其他非主属性
- C. “成绩”字段中不能包含多个成绩值
- C. 成绩表,其中包括学生ID、课程ID、分数和课程名称(因为课程名称依赖于课程ID,不满足非主属性完全依赖于主键的要求)
- A. 表中不可能存在任何传递依赖(因为3NF要求非主属性不依赖于其他非主属性,消除了传递依赖)