当 x->y 和 z->y 其中 z 不是 x 的子集时,FD(函数依赖)是否完全 fd?

Is an FD(functional dependency) fully fd when x->y and z->y where z is not a subset of x?

我看过很多关于全功能依赖的例子,但他们常说:

x->y 这样 y 不应由 x 的任何真子集确定,x 必须是键。

但是,如果 y 是由 x 的真子集或子集以外的属性确定的怎么办。

假设我有一个 students table,它由 rollno(主键)、姓名、phone no unique not null、email unique not空。

因为rollno是主键,所以设x,name为y。

现在 x->y,但是 phone 或电子邮件也确定 y(name),它不是 x 的子集。这还叫全功能依赖吗?

如果是,我们是否应该检查 y 的行列式,它们只是 x 的子集?

如果不是,我做错了什么?

您是说:

x->y such that y shouldn't be determined by any proper subset of x, x has to be a key.

但这混合了两个不同的概念,即“全功能依赖”和“关键”。

如果您不能在不失去确定右侧部分的属性的情况下删除左侧部分的任何元素,则功能依赖性是完整。所以如果一个函数依赖在左边有只有一个属性(比如rollno → name),它是总是完整的。

另一方面,(候选)键是一组属性,它决定了一个关系的所有属性,这样你就不能从中删除任何属性而不失去作为键的 属性 (所以,它不是超级键)。

在您的示例中,有三个不同的键,rollnophoneemail,每个键都由一个属性组成。

当然,如果你知道属性集X是一个键,你可以写成X → T,其中T是关系的所有属性,并且功能依赖已完成。

x->y such that y shouldn't be determined by any proper subset of x, x has to be a key.

您将 "full functional dependency" 的定义与“2NF”的定义混淆了。完全功能依赖的定义与超级键或候选键或主键无关。对于 2NF 中的关系,if X 是候选键 and Y 是 non-prime 那么 Y 不能由 X 的任何真子集确定。

当 Y 在功能上也依赖于 X 的 proper/smaller 子集时,函数依赖 X -> Y 是部分的。否则它是完整的。其他的都无所谓。

超级键是在功能上确定每一列的一列或一组列。如果其中没有更小的超级密钥,那么它就是一个候选密钥。当每个属性在功能上完全依赖于每个候选键时,关系处于 2NF。其他的都无所谓。

您可以选择一个候选键来调用主键。所以主键是候选键。否则 "primary key" 的概念与函数依赖性和规范化无关。

(在SQL中primary keyunique not null的意思相同,即superkey。只有在没有更小的情况下才是候选key superkey 在里面。所以一个集合 declared primary key 可能甚至 be 不是主键。而在 SQL 你可以'将 {} 声明为超级键。)

As rollno is a primary key, let it be x and take name as y.

主键是候选键,因此 {rollno} 确定每个属性,{rollno} 的任何适当子集都没有确定每个属性。所以 {},{rollno} 的唯一真子集,不是超级键。 (当 table 中最多只能有一行时,{} 是一个超级键。)但 {} -> name 仍然有可能。 (如果 name 列一次最多只包含一个名称。)那么 {rollno} -> name 将是部分的,因为它的适当子集 {} 确定 name.

now x->y, but phone or email also determine y(name) which are not subsets of x. Is this still called a fully functional dependent?

如果 {rollno} 的无真子集确定 name,则 {rollno} -> name 完全确定,否则部分确定。这就是定义所说的。别的都无所谓。但是我们不知道 {rollno} 的适当子集是否决定了 name 因为你没有说是否是 {} -> name

如果 {rollno}、{phoneno} 和 {email} 是候选键并且 {} 不能确定 name 那么 name在功能上完全依赖于所有这三个(因为它们中的任何一个都没有适当的子集决定 name)。