首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBMS中的第三范式

DBMS中的第三范式
EN

Stack Overflow用户
提问于 2015-06-22 14:30:17
回答 1查看 775关注 0票数 2

我刚刚读了DBMS中3NF的定义,它说:

如果:1.x是超级键,则允许函数依赖X->A。2. A是某些密钥的一部分。

我有两个疑问:

答:我不知道第二个条件对删除anomalies.Why有BCNF表单有什么用处,相反,我们可以定义3NF表单,使其没有第二个条件。

我明白消除这种依赖的意义。如果Y->Z和X是主键。当X->Y-> Z表示,除非我们知道Z,否则不能存储(X,Y)的值。

请解释如何去除3NF中的第二个条件会消除异常和/或限制冗余。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中更好。

,例如-

代码语言:javascript
复制
R=(J,K,L)
F={JK->L,L->K}

这里我们有两个候选键- JKJLR不在BCNF中。R的任何分解都不能保存JK->L。这意味着对JK->L的测试需要一个联接。所以在某些情况下-

  • BCNF不保留依赖关系,而且
  • 高效地检查更新中的函数依赖关系冲突非常重要。

解决方案:定义一个较弱的范式,称为3NF。总是有一个无损连接,保持依赖的分解为3NF.

我并不真正理解您的第二个疑问--“3NF将如何消除异常和/或限制冗余”。3NF将消除冗余购买,消除任何传递依赖!

This也可能有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30982590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档