我刚刚读了DBMS中3NF的定义,它说:
如果:1.x是超级键,则允许函数依赖X->A。2. A是某些密钥的一部分。
我有两个疑问:
答:我不知道第二个条件对删除anomalies.Why有BCNF表单有什么用处,相反,我们可以定义3NF表单,使其没有第二个条件。
我明白消除这种依赖的意义。如果Y->Z和X是主键。当X->Y-> Z表示,除非我们知道Z,否则不能存储(X,Y)的值。
请解释如何去除3NF中的第二个条件会消除异常和/或限制冗余。
发布于 2015-06-22 21:06:39
如果:1.x是超级键,则允许函数依赖X->A。2. a是某些键的一部分。
定义的第二个条件是错误。A应该是一个非素数属性(也就是说,它不应该是满足3NF的键的一部分)。
事实上,更好的理解3NF的方法是-
给定一个函数依赖项X->Y ,如果 Y是非素数属性,那么X 必须是,ae 116超键e 217__。
(请注意,此确保不存在传递依赖关系)
另一方面BCNF是-
对于,每个函数依赖项X->Y左手端必须是,一个超级键(不管右手侧是否是素数(__Y)是素数,没关系)。
,,这是你第一次怀疑
“为什么有BCNF格式,相反,我们可以定义3NF形式,使之没有第二个条件?”是的,如果删除3NF的第二个条件(即Y应该是非素数属性),那么它就相当于BCNF。但你为什么要这么做?有时,您无法减少与BCNF的关系(,因为不总是可能得到BCNF分解,即保持依赖的),那么将其还原为3NF至少比让它在2NF中更好。
,例如-
R=(J,K,L)
F={JK->L,L->K}这里我们有两个候选键- JK和JL,R不在BCNF中。R的任何分解都不能保存JK->L。这意味着对JK->L的测试需要一个联接。所以在某些情况下-
解决方案:定义一个较弱的范式,称为3NF。总是有一个无损连接,保持依赖的分解为3NF.。
我并不真正理解您的第二个疑问--“3NF将如何消除异常和/或限制冗余”。3NF将消除冗余购买,消除任何传递依赖!
This也可能有帮助。
https://stackoverflow.com/questions/30982590
复制相似问题