数据库复习题(范式,依赖)
数据库复习题(范式,依赖)。即每个字段存储的值不能再拆分。关系模式必须满足1NF才能称为“关系”。
1.关系模式SLC(sno, sdept, sloc, cno, grade)的码是:(c)
A、sno B、cno C、(sno, cno) D、sdept
sno:单独用sno(学号)可能无法唯一标识一个元组,因为同一个学生可能选修多门课程(对应多个cno和grade)。
cno:单独用cno(课程号)也无法唯一标识一个元组,因为多个学生可能选修同一门课程。
(sno, cno):组合(sno, cno)可以唯一标识一个元组,因为一个学生选修一门课程的成绩是唯一的(即一个学生在一门课程中只有一个成绩)。
sdept:单独用sdept(系别)显然不能唯一标识元组,因为一个系有多个学生和多门课程。
因此,码是(sno, cno),因为它能唯一确定关系中的每一个元组。
2.关系模式SLC(sno, sdept, sloc, cno, grade)中,部分依赖指的是(B)
A,sno->dept B,(sno,cno)->sdept C,(sno,cno)->grade D,sdept->sloc
部分依赖:某个非主属性只依赖于主键的一部分,而不是整个主键。
举例:
一个学生选课表
主键(唯一标识一条记录):
(学号, 课程号)
(因为只有学号+课程号才能确定唯一成绩)其他信息:
所在院系
、宿舍楼
、成绩
问题:
所在院系
只由学号决定(和课程号无关)→ 这就是部分依赖!
宿舍楼
只由学号决定(和课程号无关)→ 这也是部分依赖!
成绩
必须由学号+课程号
共同决定 → 不是部分依赖。
解析:
选项A:sno -> sdept
描述:学号决定院系。
是否正确?
这是函数依赖,但不是部分依赖,因为它不涉及复合主键
(sno, cno)
。部分依赖必须体现“非主属性对主键的部分依赖”,而这里没有提到主键
(sno, cno)
。结论: 不是部分依赖的正确表达。
选项B:(sno,cno) -> sdept
描述:主键
(sno,cno)
决定院系sdept
,但实际sdept
仅由sno
决定(与cno
无关)。是否正确?
这正是部分依赖的定义!
sdept
依赖于主键的一部分(仅sno
),而非整个主键。虽然写法是
(sno,cno)->sdept
,但本质是sno->sdept
(隐藏的部分依赖)。结论: 正确,这是题目对部分依赖的表述。
选项C:(sno,cno) -> grade
描述:主键
(sno,cno)
决定成绩grade
。是否正确?
grade
完全依赖于整个主键,属于完全函数依赖,不是部分依赖。选项D:sdept -> sloc
描述:院系决定宿舍位置。
是否正确?
这是普通的函数依赖,与主键
(sno,cno)
无关,更不是部分依赖。
3、关于SLC(sno, sdept, sloc, cno, grade)模式中的传递依赖,说法正确的是:(B)
A、sdept传递依赖于sno B、sloc传递依赖于sno C、grade传递依赖于sno D、cno传递依赖于sno
分析SLC模式中的依赖关系:
sno → sdept:学号(sno)可以唯一确定学生所在的系(sdept)。
sdept → sloc:学生所在的系(sdept)可以唯一确定学生的宿舍位置(sloc)。
因此,sloc 传递依赖于 sno,因为:
sno → sdept
sdept → sloc
且 sdept 不决定 sno(学号不会由系决定)。
{sno, cno} → grade:学号和课程号共同决定成绩(grade),这是完全函数依赖,不是传递依赖。
cno 与其他属性的关系:题目中没有提供 cno 与其他属性之间的直接依赖关系,因此无法得出 cno 传递依赖于 sno 的结论。
选项分析:
A:sdept 直接依赖于 sno,不是传递依赖。错误。
B:sloc 传递依赖于 sno,正确。
C:grade 依赖于 {sno, cno},是完全函数依赖,不是传递依赖。错误。
D:题目中未提供 cno 与其他属性的依赖关系,无法得出 cno 传递依赖于 sno 的结论。错误。
4,每一个分量必须是不可分的数据项。满足这个条件的关系模式称为(A)
A、1NF B、2NF C、3NF D、BCNF
题目解析:
题目描述的是“每一个分量必须是不可分的数据项”,这直接对应1NF的定义。更高范式(2NF、3NF、BCNF)是在1NF的基础上进一步约束依赖关系,而题目并未涉及依赖关系的问题。
排除法:
如果选B(2NF)、C(3NF)或D(BCNF),题目描述的条件不足以支持这些范式的定义,因为它们需要额外的依赖关系约束。
只有A(1NF)直接对应“分量不可分”的要求。
1. 第一范式(1NF)
定义
所有属性都是原子的(不可再分),即每个字段存储的值不能再拆分。
关系模式必须满足1NF才能称为“关系”。
例子
❌ 不满足1NF的表(存储复合数据):
学生ID 学生姓名 课程(可再分) 1001 张三 数学, 英语 1002 李四 物理 ✅ 满足1NF的表(每个字段不可再分):
学生ID 学生姓名 课程 1001 张三 数学 1001 张三 英语 1002 李四 物理 关键点
1NF只关心“字段是否可再分”,不关心依赖关系。
2. 第二范式(2NF)
定义
在1NF的基础上,消除“非主属性对候选键的部分函数依赖”。
要求所有非主属性必须完全依赖于整个候选键(不能仅依赖部分)。
例子
❌ 不满足2NF的表(部分依赖):
学号 课程号 学生姓名 成绩 课程学分 1001 C001 张三 90 3 1001 C002 张三 85 2
问题:
主键是
(学号, 课程号)
。
学生姓名
仅依赖于学号
(部分依赖)。
课程学分
仅依赖于课程号
(部分依赖)。✅ 拆分为满足2NF的表:
学生表(学号 → 学生姓名):
学号 学生姓名 1001 张三 课程表(课程号 → 课程学分):
课程号 课程学分 C001 3 C002 2 选课表(学号+课程号 → 成绩):
学号 课程号 成绩 1001 C001 90 1001 C002 85 关键点
2NF解决的是“非主属性部分依赖候选键”的问题。
3. 第三范式(3NF)
定义
在2NF的基础上,消除“非主属性对候选键的传递函数依赖”。
即:非主属性不能依赖于其他非主属性。
例子
❌ 不满足3NF的表(传递依赖):
学号 学生姓名 系名 系主任 1001 张三 计算机系 王老师 1002 李四 数学系 李老师
问题:
学号 → 系名
,系名 → 系主任
,因此系主任
传递依赖于学号
。✅ 拆分为满足3NF的表:
学生表(学号 → 学生姓名, 系名):
学号 学生姓名 系名 1001 张三 计算机系 1002 李四 数学系 系表(系名 → 系主任):
系名(PK) 系主任 计算机系 王老师 数学系 李老师 关键点
3NF解决的是“非主属性传递依赖候选键”的问题。
4. BCNF(Boyce-Codd范式)
定义
在3NF的基础上,进一步消除“主属性对候选键的部分或传递依赖”。
所有决定因素都必须是候选键(比3NF更严格)。
例子
❌ 不满足BCNF的表(主属性依赖非候选键):
学号 课程 教师 教师职称 1001 数学 张老师 教授 1002 物理 李老师 副教授
问题:
假设
教师 → 教师职称
,但教师
不是候选键(候选键是(学号, 课程)
)。这意味着
教师职称
依赖于非候选键教师
,违反BCNF。✅ 拆分为满足BCNF的表:
选课表(学号+课程 → 教师):
学号 课程 教师 1001 数学 张老师 1002 物理 李老师 教师表(教师 → 教师职称):
教师 教师职称 张老师 教授 李老师 副教授 关键点
BCNF比3NF更严格,确保所有依赖都基于候选键。
总结
范式 要求 解决的问题 1NF 所有字段不可再分 确保数据是“关系” 2NF 非主属性完全依赖候选键 消除部分依赖 3NF 非主属性不传递依赖候选键 消除传递依赖 BCNF 所有决定因素必须是候选键 比3NF更严格 记忆技巧
1NF:字段不可再分(原子性)。
2NF:非主属性必须完全依赖候选键(不能部分依赖)。
3NF:非主属性不能依赖其他非主属性(不能传递依赖)。
BCNF:所有依赖必须基于候选键(比3NF更严格)。
5,考虑到实际情况,以下哪些是合理的数据依赖(A)
A、姓名依赖于学号 B、学号依赖于姓名 C、性别依赖于年龄 D、年龄依赖于性别
数据依赖的定义
函数依赖:
如果属性集 X 能唯一决定属性集 Y,则称 Y 函数依赖于 X,记作 X→Y。合理的依赖:
在现实世界中,X→Y成立,意味着 X 的值能唯一确定 Y 的值。
逐项分析选项
A、姓名依赖于学号(学号 → 姓名)
现实逻辑:
在数据库中,学号通常是唯一的,每个学号对应一个学生。
一个学号只能对应一个姓名(一个人不会有两个不同的姓名)。
结论:
✅ 合理,学号可以唯一确定姓名。
B、学号依赖于姓名(姓名 → 学号)
现实逻辑:
姓名可能有重复(多个学生可能同名,如“张三”)。
一个姓名可能对应多个学号(无法唯一确定学号)。
结论:
❌ 不合理,姓名不能唯一决定学号。
C、性别依赖于年龄(年龄 → 性别)
现实逻辑:
年龄和性别之间没有必然联系。
同一个年龄的人可能有男有女(如20岁的人既有男性也有女性)。
结论:
❌ 不合理,年龄不能决定性别。
D、年龄依赖于性别(性别 → 年龄)
现实逻辑:
性别和年龄之间没有必然联系。
同一个性别的人可能有不同年龄(如男性可以是10岁、20岁、30岁等)。
结论:
❌ 不合理,性别不能决定年龄。
6、下面哪些依赖,属于平凡函数依赖(D)
A、姓名依赖于学号
B、性别依赖于学号
C、成绩依赖于(学号,课程号)
D、学号依赖于(学号,课程号)
平凡函数依赖的定义
在关系模式 R(U) 中,如果 X→Y,并且 Y⊆X(即 Y 是 X 的子集),则称 X→Y 为平凡函数依赖。
换句话说,如果 YY 已经包含在 XX 中,那么 X→YX→Y 就是平凡的。例子
{A,B}→{A}({A}⊆{A,B})→ 平凡依赖
{A,B}→{C}({C} 不在{A,B} 中)→ 非平凡依赖
逐项分析选项
A、姓名依赖于学号(学号 → 姓名)
分析:
X={学号}
Y={姓名}
{姓名} 不是 {学号} 的子集。
结论:
❌ 非平凡依赖(因为姓名不在学号中)。
B、性别依赖于学号(学号 → 性别)
分析:
X={学号}
Y={性别}
{性别} 不是 {学号} 的子集。
结论:
❌ 非平凡依赖(因为性别不在学号中)。
C、成绩依赖于(学号,课程号)({学号, 课程号} → 成绩)
分析:
X={学号,课程号}
Y={成绩}
{成绩} 不是{学号,课程号} 的子集。
结论:
❌ 非平凡依赖(因为成绩不在 {学号, 课程号} 中)。
D、学号依赖于(学号,课程号)({学号, 课程号} → 学号)
分析:
X={学号,课程号}
Y={学号}
{学号}⊆{学号,课程号}(因为学号是 XX 的子集)。
结论:
✅ 平凡依赖(因为学号已经包含在 {学号, 课程号} 中)。
总结
平凡依赖:
D、学号依赖于(学号,课程号)(因为学号是 {学号, 课程号} 的子集)。非平凡依赖:
A、B、C(因为右侧属性不在左侧属性集中)。最终答案
D、学号依赖于(学号,课程号) 是平凡函数依赖。
关键概念回顾
码(Key):
能唯一标识一条记录的属性(或属性组)。
可以是超码(Superkey,能唯一标识但可能包含冗余属性)或候选码(最小的超码)。
部分依赖:
在
X → Y
中,如果X
是复合属性(如{A, B}
),而Y
仅依赖于X
的一部分(如仅A
),则称Y
部分依赖于X
。2NF 要求消除非主属性对码的部分依赖。
主属性和非主属性:
主属性:包含在任何一个候选码中的属性。
非主属性:不包含在任何候选码中的属性。
步骤 1:确定该关系模式的码
观察数据:
仅
Sno
(学号)无法唯一标识一条记录,因为同一个学生可能选修多门课程(但表中Sno
无重复,可能是题目数据限制)。仅
Cno
(课程号)也无法唯一标识,因为多个学生可能选修同一门课程。
{Sno, Cno}
组合可以唯一确定一条记录(即一个学生的某门课成绩),因此:
{Sno, Cno}
是候选码(最小的超码)。题目中
Sno
单独不能作为码(除非题目数据表明Sno
唯一,但现实逻辑中Sno + Cno
更合理)。结论:
A(码是
Sno
)❌ 错误,因为Sno
不能单独唯一标识。B(没有码)❌ 错误,
{Sno, Cno}
是码。
步骤 2:检查是否存在部分依赖
码:
{Sno, Cno}
非主属性:
Sdept
、Mname
、Grade
分析依赖关系:
Grade
:
由
{Sno, Cno}
共同决定(一个学生的某门课成绩),属于完全依赖,无部分依赖。
Sdept
和Mname
:
从数据看,
Sdept
和Mname
仅由Sno
决定(同一个学号对应同一个系和系主任)。即
Sno → Sdept
和Sno → Mname
。但码是
{Sno, Cno}
,因此Sdept
和Mname
仅依赖于码的一部分(Sno
),属于部分依赖。结论:
C(存在非主属性对码的部分依赖)✅ 正确。
D(不存在部分依赖)❌ 错误。
步骤 3:范式分析
1NF:满足(所有属性原子)。
2NF:不满足(存在非主属性
Sdept
、Mname
对码{Sno, Cno}
的部分依赖)。3NF/BCNF:未达到。
最终答案
C、该模式存在非主属性对码的部分依赖 是正确的
关键概念回顾
码(Key):
能唯一标识一条记录的属性(或属性组)。
在本题中,
{Sno, Cno}
是候选码(因为需要学号和课程号共同确定成绩)。部分依赖:
非主属性依赖于码的一部分(如仅依赖于
Sno
或仅依赖于Cno
)。传递依赖:
如果
A → B
且B → C
,则A → C
是传递依赖(前提是B
不决定A
)。2NF:
在1NF的基础上,消除非主属性对码的部分依赖。
3NF:
在2NF的基础上,消除非主属性对码的传递依赖。
步骤 1:确定码和非主属性
候选码:
{Sno, Cno}
(因为需要学号和课程号共同确定成绩)。非主属性:
Sdept
、Mname
、Grade
。
步骤 2:检查部分依赖(判断是否满足2NF)
Grade
:
完全依赖于
{Sno, Cno}
(一个学生的某门课成绩),无部分依赖。
Sdept
和Mname
:
从数据看,
Sno → Sdept
和Sno → Mname
(同一个学号对应同一个系和系主任)。但码是
{Sno, Cno}
,因此Sdept
和Mname
仅依赖于码的一部分(Sno
),属于部分依赖。结论:
存在部分依赖 → 不满足2NF。
A(该模式是2NF)❌ 错误。
步骤 3:检查传递依赖
传递依赖的定义是:
A → B
且B → C
,则A → C
是传递依赖。观察依赖关系:
Sno → Sdept
(一个学号对应一个系)。
Sdept → Mname
(一个系对应一个系主任)。因此
Sno → Mname
是传递依赖(因为Sdept
不决定Sno
)。结论:
存在传递依赖(
Sno → Mname
)。B(存在传递依赖)✅ 正确。
C(不存在传递依赖)❌ 错误。
步骤 4:判断模式结构是否合理
该模式存在部分依赖和传递依赖,导致数据冗余和更新异常(如系主任姓名重复存储)。
因此结构不合理,需拆分为多个表(如学生表、系表、选课表)。
D(该模式结构合理)❌ 错误。
范式分析总结
1NF:满足(所有属性原子)。
2NF:不满足(存在部分依赖)。
3NF:不满足(存在传递依赖)。
最终答案
B、该模式中,存在传递依赖 是正确的
关系模式的组成
关系模式通常表示为 R(U,D,DOM,F),其中:
U:属性的集合(即表的字段名,如学号、姓名等)。
D:属性的域(取值范围,如学号的域是字符串集合)。
DOM:属性到域的映射(如"学号"映射到字符串域)。
F:属性间的数据依赖(如函数依赖 学号→姓名学号→姓名)。
选项分析
A. U:表示属性集合,错误。
B. D:表示属性的域(取值范围),错误。
C. DOM:表示属性与域的映射关系,错误。
D. F:表示属性间的数据依赖(如函数依赖、多值依赖等),正确。
为什么选 D?
数据依赖(如函数依赖 X→Y)是关系数据库设计的核心概念,用于描述属性间的约束关系。
在形式化定义中,F 专门用于表示这些依赖规则。
常见混淆点
可能误选 D,因为字母"D"容易联想到"Dependency"(依赖),但实际 D 表示"Domain"(域)。
F 是"Functional Dependency"的缩写,代表数据依赖。
10、以下范式规范化程度最高的是(D)
A、2NF B、3NF C、BCNF D、4NF
范式层级关系
数据库范式从低到高依次为:
1NF(第一范式):确保字段原子性(不可再分)。
2NF(第二范式):在1NF基础上,消除非主属性对码的部分依赖。
3NF(第三范式):在2NF基础上,消除非主属性对码的传递依赖。
BCNF(Boyce-Codd范式):在3NF基础上,消除主属性对码的部分或传递依赖(更严格的3NF)。
4NF(第四范式):在BCNF基础上,消除多值依赖。
范式越高,规范化程度越高,冗余越少,但查询可能越复杂。
选项分析
A. 2NF:仅解决部分依赖问题,低于3NF、BCNF和4NF。
B. 3NF:解决部分依赖和传递依赖,但低于BCNF和4NF。
C. BCNF:比3NF更严格,但仍低于4NF。
D. 4NF:目前选项中最高级的范式,解决多值依赖问题。
为什么是4NF?
4NF 在BCNF的基础上进一步消除了多值依赖(即一个属性决定一组值,而非单个值的情况)。
例如,如果一个关系模式中存在
学号 →→ 课程
和学号 →→ 爱好
,则需要4NF来拆分表。4NF的规范化程度高于BCNF、3NF和2NF。
常见误区
误选BCNF:
BCNF已经很严格,但4NF针对的是多值依赖(BCNF不解决此问题)。忽略多值依赖:
多值依赖在实际数据库中较少见,但理论上是比函数依赖更高级的约束。
11、关系数据库规范化是解决关系数据库中()问题而引人的。(A)
A、插入、删除和数据冗余
B、提高查询速度
C、减少数据操作的复杂性
D、保证数据的安全性和完整性
关系数据库规范化的核心目标
数据库规范化(Normalization)的主要目的是减少数据冗余,并由此解决因冗余导致的数据操作异常,包括:
插入异常:
例如,无法单独插入一个系的信息,除非有学生属于该系。
删除异常:
例如,删除某个学生的选课记录时,可能意外删除该系的唯一信息。
更新异常:
例如,修改系主任姓名时,需要更新多条记录,否则数据不一致。
这些问题均源于数据冗余,而规范化通过分解表结构来消除冗余。
选项分析
A. 插入、删除和数据冗余:
✅ 正确。规范化直接解决因冗余导致的插入、删除异常。B. 提高查询速度:
❌ 错误。规范化可能增加查询复杂度(需要多表连接),有时甚至需要反规范化(Denormalization)来提高查询性能。C. 减少数据操作的复杂性:
❌ 错误。规范化可能增加操作复杂性(如多表关联),但这是为了数据一致性付出的代价。D. 保证数据的安全性和完整性:
❌ 错误。安全性和完整性通常通过权限控制、约束(如主键、外键)实现,而非规范化。
12、关系模式中,满足2NF的模式(B)。
A、可能是1NF B、必是1NF C、必是3NF D、必是BCNF
范式层级关系
数据库范式从低到高依次为:
1NF(第一范式):所有属性都是原子的(不可再分)。
2NF(第二范式):在1NF基础上,消除非主属性对码的部分依赖。
3NF(第三范式):在2NF基础上,消除非主属性对码的传递依赖。
BCNF(Boyce-Codd范式):在3NF基础上,消除主属性对码的部分或传递依赖。
范式之间的关系:
满足更高范式的模式必然满足所有更低范式(如3NF必然满足2NF和1NF)。
但满足低范式的模式不一定满足更高范式(如2NF不一定满足3NF)。
选项分析
A. 可能是1NF:
❌ 表述不严谨。2NF 必然满足1NF,而非“可能”。B. 必是1NF:
✅ 正确。2NF的定义建立在1NF的基础上,因此满足2NF必然满足1NF。C. 必是3NF:
❌ 错误。2NF可能仍存在传递依赖(即不满足3NF)。D. 必是BCNF:
❌ 错误。BCNF比3NF更严格,2NF显然不一定满足。
关键结论
2NF ⇒ 1NF(必然成立)。
2NF ⇏ 3NF(不一定成立)。
反例说明:
如果一个关系模式满足2NF但存在非主属性对码的传递依赖,则它不满足3NF。例如:
表
Student(Sno, Sdept, Mname)
,其中:
码:
Sno
(假设学号唯一)。依赖:
Sno → Sdept
,Sdept → Mname
(传递依赖)。该表满足2NF(无部分依赖),但不满足3NF(存在传递依赖)。
总结
满足2NF的模式必然满足1NF,但无法保证更高范式(如3NF或BCNF)。
13、任何满足2NF但不满足3NF的关系模式都存在(D)。
A、主属性对候选码的部分依赖
B、非主属性对候选码的部分依赖
C、主属性对候选码的传递依赖
D、非主属性对候选码的传递依赖
核心概念回顾
2NF(第二范式):
在1NF的基础上,消除非主属性对候选码的部分依赖。
即所有非主属性必须完全依赖于候选码(不能仅依赖候选码的一部分)。
3NF(第三范式):
在2NF的基础上,消除非主属性对候选码的传递依赖。
即非主属性不能依赖于其他非主属性(如
A → B → C
,且B
不决定A
)。主属性 vs 非主属性:
主属性:包含在任何一个候选码中的属性。
非主属性:不包含在任何候选码中的属性。
题目关键点
满足2NF但不满足3NF:
说明已消除部分依赖(满足2NF),但仍存在传递依赖(不满足3NF)。必然存在的问题:
根据定义,只能是非主属性对候选码的传递依赖(因为2NF已解决部分依赖问题)。
选项分析
A. 主属性对候选码的部分依赖:
❌ 错误。2NF已消除非主属性的部分依赖,但主属性的部分依赖由BCNF解决(与3NF无关)。B. 非主属性对候选码的部分依赖:
❌ 错误。2NF已解决此问题(否则不满足2NF)。C. 主属性对候选码的传递依赖:
❌ 错误。主属性的传递依赖由BCNF解决(与3NF无关)。D. 非主属性对候选码的传递依赖:
✅ 正确。3NF需要消除非主属性的传递依赖,因此这是2NF满足但3NF不满足的唯一原因。
反例验证
假设关系模式
R(Sno, Sdept, Mname)
,其中:
候选码:
Sno
(学号唯一)。函数依赖:
Sno → Sdept
(学号决定系别)。
Sdept → Mname
(系别决定系主任)。分析:
2NF:满足(无部分依赖,因为码是单属性
Sno
)。3NF:不满足(存在传递依赖
Sno → Sdept → Mname
)。问题:非主属性
Mname
对候选码Sno
的传递依赖。
总结
任何满足2NF但不满足3NF的关系模式,必然存在非主属性对候选码的传递依赖。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)