【发布时间】:2021-09-10 19:02:18
【问题描述】:
我目前正在尝试了解功能依赖关系以及如何从中派生候选键。在一项作业中,我得到了以下关系 R
| Lecture | Room | Date | NStudents | Lecturer | Tool |
|---|---|---|---|---|---|
| Graphical DP | 209 | Wed. 1 | 53 | 0210 | Overhead-Pr. |
| Graphical DP | 209 | Fr. 3 | 53 | 0210 | Overhead-Pr. |
| C | 413 | Tue. 1 | 86 | 0111 | PC |
| C | 413 | Tue. 1 | 86 | 0111 | Overhead-Pr. |
| C | 413 | Wed. 3 | 86 | 0111 | PC |
| C | 413 | Wed. 3 | 86 | 0111 | Overhead-Pr. |
| Mathematics | 418 | Mo. 1 | 76 | 0342 | Board |
| Mathematics | 318 | Thur. 2 | 76 | 0342 | Board |
| Data Structures | 310 | Fr. 2 | 32 | 0550 | Board |
| Data Structures | 310 | Fr. 2 | 32 | 0550 | Overhead-Pr. |
第一个任务是在关系 R 中找到所有有意义的函数依赖。
函数依赖在我们的讲座中被定义为
对于具有任意属性集 X 和 Y 的关系 R,如果对于所有 (x1,y1) 和所有 (x2,y2) 具有 x1,x2∈X,Y 在功能上依赖于 X(我们也说 X 确定 Y)并且 y1,y2∈Y 成立:x1=x2 ⇒ y1=y2,即 X 中任何相同的值组合必须以 Y 中的相同值组合为条件。
使用此定义,我确定了以下一组功能依赖项
FD = {Lecture -> (NStudents, Lecturer), (Room, Date) -> (Lecture, Lecturer), (Lecture, Date) -> (Room, Lecturer), (Date, Lecturer) -> Lecture, (日期,工具)-> 讲座}
但是,我不知道它们是否有意义,因为没有指定有意义的确切含义。
下一个任务是识别候选键。
在我们的讲座中,超级键被定义为
令 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)+ 中
- (Room, Date)+ = {Room, Date, Lecture, NStudents, Lecturer}
- (讲座,日期)+ = {讲座,日期,房间,讲师}
由于 NStudents 可以从 Lecture 派生,我再次将 NStudents 添加到属性闭包集
- (Lecture, Date)+ = {Lecture, Date, Room, Lecturer, NStudents}
- (日期,讲师)+ = {日期,讲师,讲座}
因为 NStudents 可以从 Lecture 和 Room 从 Lecture 和 Date 派生,所以我将这些属性添加到闭包集
- (日期,讲师)+ = {日期,讲师,讲座,NStudents,房间}
- (日期,工具)+ = {日期,工具,讲座}
NStudents 和 Lecturer 可以从 Lecture 派生,Room 可以从 Date and Lecturer 或 Date and Lecture 派生,所以我将这些属性添加到闭包集合中
- (日期,工具)+ = {日期,工具,讲座,NStudents,讲师,房间}
如果我没有遗漏任何内容,则属性集 {Date, Tool} 是一个全功能依赖项,因为没有 Z->Y 对应的 Z⊂X。
但是,练习的解决方案是以下属性集:
- {讲座、工具、日期}
- {房间、工具、日期}
- {讲师、工具、日期}
我想知道为什么要添加另一个属性?这一步不是让属性集只是部分功能依赖吗?
【问题讨论】:
-
您尝试遵循哪些步骤?你到底得到了什么,你的目标到底是什么?您是否找到该值的 FD 和 CK,或者可以保存该值的变量,或者具有该值的 FD 的变量? (样本值只能告诉您哪些 FD 不包含在其变量中,而不是哪些。)加上常识?你说你找到了一些持有的 FD。他们为什么这样做?另外——需要所有持有的 FD 才能找到 CK。是F吗?为什么? PS“据我所知”通常意味着“我不明白,但是”。您给出了哪些定义和算法?
-
我试图实施您的批评,添加定义和我的解决方案步骤。
-
您还没有解决很多问题:什么是 FD 的价值或变量以及您应该如何确定它们以及为什么您认为拥有 F 可以让您确定 CK 等,请参阅我的之前的评论。你不解释“有意义”——这不是一个技术术语,你需要问你的老师。如果您写出您认为您正在遵循的程序以及当您出错时我们如何阻止您,但您所做的只是列出事情而不说明它们与彼此或给定或目标之间的关系。例如,如果您发现了一些 FD 怎么办?--我说过--您需要找到哪些持有,哪些没有。
标签: database functional-dependencies candidate-key