从功能依赖关系中确定候选键:我们不使用最小超级键的例外情况?

Determining candidate keys from functional dependencies: Exceptions where we don't use the minimal super key?

我目前正在尝试了解函数依赖关系以及如何从中派生候选键。在作业中,我得到了以下关系 R

讲座 房间 日期 N学生 讲师 工具
图形DP 209 周三。 1 53 0210 Overhead-Pr.
图形DP 209 神父。 3 53 0210 Overhead-Pr.
C 413 周二。 1 86 0111 电脑
C 413 周二。 1 86 0111 Overhead-Pr.
C 413 周三。 3 86 0111 电脑
C 413 周三。 3 86 0111 Overhead-Pr.
数学 418 莫。 1 76 0342 董事会
数学 318 星期四2 76 0342 董事会
数据结构 310 神父。 2 32 0550 董事会
数据结构 310 神父。 2 32 0550 Overhead-Pr.

第一个任务是找到关系 R 中所有有意义的 函数依赖。

函数依赖在我们的讲座中定义为

For a relation R with arbitrary attribute sets X and Y, Y is functionally dependent on X (we also say X determines Y) if for all (x1,y1) and all (x2,y2) with x1,x2∈X and y1,y2∈Y holds: x1=x2 ⇒ y1=y2, i.e., any same combination of values in X must condition the same combination of values in Y.

使用这个定义,我确定了以下一组函数依赖性

FD = {讲座 -> (NStudents, Lecturer), (Room, Date) -> (Lecture, Lecturer), (Lecture, Date) -> (Room, Lecturer), (Date, Lecturer) ->讲座,(日期,工具)-> 讲座}

但是,我不知道它们是否有意义,因为没有具体说明有意义的确切含义。

下一个任务是识别候选键。

在我们的讲座中,一个超级键被定义为

Let A be the set of all attributes of a relation R and let K be an arbitrary attribute set of R.

K is called a superkey if K->A

全功能依赖在我们的讲座中定义为

A functional dependency X -> Y is a full functional dependency if there is no Z⊂X for which Z->Y holds, otherwise X->Y is a partial functional dependency.

因此,候选键定义为

If K->A is a full functional dependency, then K is called a candidate key of R

接下来,我构建了属性闭包集来找到一组满足候选键定义的属性

由于 NStudents 可以从 Lecture 派生,我将属性添加到闭包集 (Room, Date)+ 因此

由于 NStudents 可以从 Lecture 派生,我再次将 NStudents 添加到属性闭包集

因为 NStudents 可以从 Lecture 和 Room 派生自 Lecture 和 Date,所以我将这些属性添加到闭包集

NStudents 和 Lecturer 可以派生自 Lecture,Room 可以派生自 Date 和 Lecturer 或 Date 和 Lecture,所以我将这些属性添加到闭包集

如果我没有遗漏任何东西,属性集 {Date, Tool} 是一个功能齐全的依赖项,因为没有 Z->Y 对应的 Z⊂X。

不过,练习的答案是以下属性集:

我想知道为什么要添加另一个属性?这一步不会使属性集只是部分功能依赖吗?

通过关系给定一个特定的现实模型,其中包含的功能依赖性来自所表示数据的意义。样本数据集,如你的例子,只能给出模糊的暗示,不能完整表达。

例如,从您的示例中可以得出 Lecturer -> Lecture(反之亦然)的结论,但仅从数据来看,我们无法确定同一 Lecturer 会在特定时间(或反之亦然)进行两个不同的 Lecture。推断依赖关系的另一个示例可能是房间 -> 讲座,因为每个房间都有一个独特的、不同的讲座。

所以,给出一组函数依赖关系的正确方法是知道数据的含义,并用这种表示法表达它们之间的依赖关系。

此外,请注意,不同的函数依赖集可以是等价的(从技术上讲,它们被称为关系中依赖关系的“覆盖”),以不同的方式描述相同的含义。

因此,当需要在特定情况下给出一组 FD 持有时,我们尝试给出最小的依赖集,因为有一些方法可以让我们从中找到所有派生的依赖项,因为通过所谓的阿姆斯特朗公理举例。

当提出一个练习时,就像你的情况一样,我们应该在其中找到“有意义的 函数依赖关系”,我们唯一能做的就是部分地看看数据并部分尝试理解数据的含义,找到一组不太冗余但尽可能多地捕获数据含义的FD。一般来说,最小值主要意味着两件事:a) 具有尽可能小的属性集,以及 b) 具有无法从其他项派生的依赖项。

例如,根据您的数据,可以生成一组这样的数据:

Lecture -> Lecturer
Lecturer -> Lecture
Room -> Lecture
Lecture -> NStudents
NStudents -> Lecture
Tool, Date -> Room

几乎不可能知道集合是否完整并且在一般情况下是真实的(例如,可能有相同数量的学生的讲座,但有不同的学生,而且学生人数只是偶然是相等的),尽管我们可以认为根据显示的数据这是“合理的”。

在这种情况下,假设上面的FD是关系依赖的覆盖(所有其他FD都可以从上面的集合中导出),你认为唯一的候选键是(工具, 日期).

但也许在你的老师的脑海中有其他不存在的数据(或关于模型的其他信息)与这组 FD 相矛盾,因此练习的答案与我们可以从数据中进行的推论不同.