我目前正在尝试了解功能依赖关系以及如何从中派生候选键。在一项作业中,我得到了以下关系 R
演讲 | 房间 | 日期 | 学生 | 讲师 | 工具 |
---|---|---|---|---|---|
图形 DP | 209 | 星期三。1 | 53 | 0210 | 开销-公关。 |
图形 DP | 209 | 神父。3 | 53 | 0210 | 开销-公关。 |
C | 413 | 周二。1 | 86 | 0111 | 个人电脑 |
C | 413 | 周二。1 | 86 | 0111 | 开销-公关。 |
C | 413 | 星期三。3 | 86 | 0111 | 个人电脑 |
C | 413 | 星期三。3 | 86 | 0111 | 开销-公关。 |
数学 | 418 | 月 1 | 76 | 0342 | 木板 |
数学 | 318 | 星期四。2 | 76 | 0342 | 木板 |
数据结构 | 310 | 神父。2 | 32 | 0550 | 木板 |
数据结构 | 310 | 神父。2 | 32 | 0550 | 开销-公关。 |
第一个任务是在关系 R 中找到所有有意义的函数依赖。
函数依赖在我们的讲座中定义为
对于具有任意属性集 X 和 Y 的关系 R,如果对于所有 (x1,y1) 和所有 (x2,y2) 具有 x1,x2∈X 和 y1,Y 在功能上依赖于 X(我们也说 X 确定 Y), y2∈Y 成立:x1=x2 ⇒ y1=y2,即 X 中任何相同的值组合必须以 Y 中的相同值组合为条件。
使用此定义,我确定了以下一组功能依赖项
FD = {Lecture -> (NStudents, Lecturer), (Room, Date) -> (Lecture, Lecturer), (Lecture, Date) -> (Room, Lecturer), (Date, Lecturer) -> Lecture, (Date,工具)-> 讲座}
但是,我不知道它们是否有意义,因为没有指定有意义的确切含义。
下一个任务是识别候选键。
在我们的讲座中,超级键被定义为
令 A 为关系 R 的所有属性的集合,令 K 为 R 的任意属性集。
如果 K->A,则 K 称为超级键
全功能依赖在我们的讲座中定义为
如果没有 Z->Y 成立的 Z⊂X,则函数依赖 X -> Y 是完全函数依赖,否则 X->Y 是部分函数依赖。
因此,候选键定义为
如果 K->A 是全函数依赖,那么 K 称为 R 的候选键
接下来,我构造了属性闭包集来找到一组满足候选键定义的属性
- (讲座)+ = {NStudents, Lecturer}
- (房间,日期)+ = {房间,日期,讲座,讲师}
由于 NStudents 可以从 Lecture 派生,因此我将属性添加到闭包集 (Room, Date)+
- (房间,日期)+ = {房间,日期,讲座,NStudents,讲师}
- (讲座,日期)+ = {讲座,日期,房间,讲师}
由于 NStudents 可以从 Lecture 派生,我再次将 NStudents 添加到属性闭包集中
- (讲座,日期)+ = {讲座,日期,房间,讲师,NStudents}
- (日期,讲师)+ = {日期,讲师,讲座}
因为 NStudents 可以从 Lecture 和 Room 派生自 Lecture 和 Date 我将这些属性添加到闭包集中
- (日期,讲师)+ = {日期,讲师,讲座,NStudents,房间}
- (日期,工具)+ = {日期,工具,讲座}
NStudents 和 Lecturer 可以从 Lecture 派生,Room 可以从 Date and Lecturer 或 Date and Lecture 派生,所以我将这些属性添加到闭包集中
- (日期,工具)+ = {日期,工具,讲座,NStudents,讲师,房间}
如果我没有遗漏任何东西,属性集 {Date, Tool} 是一个全功能依赖项,因为没有 Z->Y 的 Z⊂X。
但是,该练习的解决方案是以下属性集:
- {讲座、工具、日期}
- {房间、工具、日期}
- {讲师,工具,日期}
我想知道为什么要添加另一个属性?这一步不是使属性集只是部分功能依赖吗?