【发布时间】:2016-10-31 12:27:14
【问题描述】:
我一直在学习“Elmasri 和 Navathe 的数据库系统基础(第 6 版)”中的规范化,但我无法理解以下关于 2NF 的部分。
下图是教科书2NF下给出的例子
候选键是{SSN,Pnumber} 依赖项是 SSN,Pnumber -> 小时, SSN -> ename, pnumber->pname, pnumber -> 位置
正式定义:
A relation schema R is in 2NF if every nonprime attribute A in R is
fully functionally dependent on the primary key of R.
例如上图:
如果假设,我定义一个额外的函数依赖 SSN -> 小时,然后取两个函数依赖,
{SSN,Pnumber} -> hours and SSN -> hours
关系不会是 2NF,因为现在 SSN ->hours 现在是部分函数依赖,因为 SSN 是给定候选键 {SSN,Pnumber} 的真子集。
查看2NF上的关系及其一般定义,我假设上述关系在2NF中
就我的理解以及我如何理解 2NF 是什么而言,
A relation is in 2NF if one cannot find a proper subset (prime attributes)
of the on the left hand side (candidate key) of a functional dependency
which defines the NPA(non prime attribute).
我的第一个问题是,为什么上述关系不在 2NF 中? (教科书已将上述关系视为不在2NF中)
然而,本章开头定义了一种非正式的方法(根据教科书的步骤,一个不知道规范化的普通人可以采取哪些步骤来减少冗余)是:
■ Making sure that the semantics of the attributes is clear in the schema
■ Reducing the redundant information in tuples
■ Reducing the NULL values in tuples
■ Disallowing the possibility of generating spurious tuples
提到的指导方针如下:
我的第二个问题是,如果考虑到上述步骤,并考虑为什么以下关系不在 2NF 中,您是否假设以下函数依赖关系,即,
{SSN,Pnumber} -> Pname
{SSN,Pnumber} -> Plocation
{SSN,Pnumber} -> Ename
使关系的分解正确吗?如果假设的函数依赖不正确,那么导致该关系不满足 2NF 条件的因素是什么?
从一般的角度来看...因为该表包含多个主要属性并且存储的信息与员工和项目信息有关,因此可以指出这些需要分开,因为 Pnumber 是作为复合键的主要属性,可以直观地猜出冗余。这是因为我们知道属性的语义。
如果属性被替换为 A,B,C,D,E,F 会怎样
我的第三个问题是,功能依赖关系是否基于“数据库的功能和具有属性领域知识的数据库设计者”预先确定?
因为基于给定点的数据和关系状态,函数依赖关系可以改变,在一个状态下有效的函数在某个状态下可能会失效。一般来说,这可以说是任何非主属性决定非主属性。
正式定义:
A functional dependency, denoted by X → Y, between two sets of
attributes X and Y that are subsets of R specifies a constraint on the
possible tuples that can form a relation state r of R. The constraint is
that, for any two tuples t1 and t2 in r that have t1[X] = t2[X], they must
also have t1[Y] = t2[Y].
那么预定义函数依赖会不会是错误的,因为在任何给定点上都不能泛化关系状态?
如果我对事物的基本理解一开始就有缺陷,请原谅我。
【问题讨论】:
-
Re "如果假设,
{SSN,Pnumber} -> hours and SSN -> hours这种关系不会在 2NF 中,因为现在 SSN ->hours 是部分函数依赖关系" 这种推理是不正确的,除非您添加它是候选键上的非主属性。但孤立的 FD 并不意味着 2NF。 -
@philipxy 如果您可以编辑该问题,如果它无法被其他人理解,我会很高兴......我会确保您所做的编辑是否传达了我手头的问题。因为我一直在努力寻找答案并澄清我的疑问。
-
但是由于 SSN 是候选键的真子集,假设 {SSN, Pnumber} 是上述关系的候选键,那么当 { SSN, Pnumber} 在功能上确定小时数?
-
您上一条评论的问题很困惑: 1. PK 无关紧要。忘记他们。 PK 是您称为 PK 的 CK。 2. CK 不是 FD。 3. 主属性 = 某些 CK 的属性。 4. 当您被告知某些 FD 持有时,某些其他 FD 也持有。 5. 所以:查找/接收一些持有和不持有的 FD。然后某些规则给出了当持有的 FD 时也必须持有的所有 FD。然后在确定每个 FD (set -> set) 是否持有之后,确定持有和不持有的 FD 的 CK。那么你有 2NF 当且仅当没有非主属性部分依赖于 CK。
-
我不知道你在括号里想表达什么。 (也许“你需要假设”你的意思是“暗示”。)要显示 2NF 所有 FD,必须考虑到。教科书可以明确并说“在这些示例中,唯一持有的FD是给定的,由于给定的CK而持有的FD以及那些隐含的FD(即从那些得出的,即当那些做的时候也必须成立)。”但要证明 2NF 是违反,您只需要找到 1 个错误的 FD。所以在这里了解CK & FD2 或FD3 就足够了。别人持有什么并不重要。为什么会这样?
标签: database database-design relational-database database-normalization