Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database BCNF什么时候不保留函数依赖关系,我应该使用3NF吗? BCNF何时不能保留功能依赖关系 什么时候需要3NF分解而不是BCNF分解来保持函数依赖性_Database_Database Normalization_Functional Dependencies_3nf_Bcnf - Fatal编程技术网

Database BCNF什么时候不保留函数依赖关系,我应该使用3NF吗? BCNF何时不能保留功能依赖关系 什么时候需要3NF分解而不是BCNF分解来保持函数依赖性

Database BCNF什么时候不保留函数依赖关系,我应该使用3NF吗? BCNF何时不能保留功能依赖关系 什么时候需要3NF分解而不是BCNF分解来保持函数依赖性,database,database-normalization,functional-dependencies,3nf,bcnf,Database,Database Normalization,Functional Dependencies,3nf,Bcnf,请举例说明 我看到了这个问题,但它没有回答我的问题: BCNF何时不能保留功能依赖关系 事实证明,这个问题在某种程度上是有问题的,“好吧,你定义了‘素数’,但什么时候是素数?”是,但“好吧,你定义了‘分数的最简单形式’,但什么时候是分数的最简单形式?”不是。定义为“何时”。但你的意思是,多个条件适用,那么有什么更简单/直观的定义或非暴力算法来描述这一点?但已经证明(非正式地)没有非指数/非穷举算法来枚举BCNF分解,这些分解可以/不可以保留FDs(函数依赖) 什么时候需要3NF分解而不是

请举例说明

我看到了这个问题,但它没有回答我的问题:

  • BCNF何时不能保留功能依赖关系
事实证明,这个问题在某种程度上是有问题的,“好吧,你定义了‘素数’,但什么时候是素数?”是,但“好吧,你定义了‘分数的最简单形式’,但什么时候是分数的最简单形式?”不是。定义为“何时”。但你的意思是,多个条件适用,那么有什么更简单/直观的定义或非暴力算法来描述这一点?但已经证明(非正式地)没有非指数/非穷举算法来枚举BCNF分解,这些分解可以/不可以保留FDs(函数依赖)

  • 什么时候需要3NF分解而不是BCNF分解[不]保留函数依赖关系
如果一个3NF设计不在BCNF中,那么它会保留一个不是超键的FD,因此不能在大多数SQL DBMS中以声明方式强制执行。但是,BCNF设计没有保留FD,需要强制执行一个约束,该约束相当于两个SQL FK(
外键
)约束,这在大多数SQL DBMS中不能以声明方式强制执行。由于循环没有什么特别之处可以阻止DBMS执行它们,而且这两种设计可以相互代表,因此DBMS本身没有任何理由不能同时支持这两种设计

这两种设计形式有着相似的心理复杂性——3NF加FDs不出CKs,而BCNF加上额外的相等依赖。但由于3NF关系是其BCNF组件的连接,因此3NF元组的含义是BCNF组件含义的AND/连接。由于用户隐式地知道这一点,并且应该明确地告诉它,并且由于查询或修改数据库不需要约束(它们是为了完整性),所以BCNF设计在某种意义上更简单。但是如果用户总是想更新这两个组件,那么3NF设计在某种意义上更简单

因此,如果我们无法获得保持依赖关系的BCNF分解,通常最好选择BCNF,因为在SQL中检查主键约束以外的函数依赖关系是很困难的。
--数据库系统概念第6版(2011年),由Silberschatz、Korth和Sudarshan出版

你可以在大多数教科书中找到一个面对这种选择的例子,很多都是pdf格式的。它必须涉及重叠(复合)CKs(候选关键点)

SJT元组(s,j,t)——简化符号——的意思是学生s由教师t教授科目j。以下约束条件适用:

  • 对于每个科目,该科目的每个学生只由一名教师教授
  • 每个老师只教一门课(但每门课都有几位老师教)
[…]从第一个约束,我们得到了FD{S,J}→ 根据第二个约束,我们得到了FD T→ J.
--数据库系统导论第8版(2004年)按日期


(一个3NF设计可能会遇到更多的问题,这些问题可以通过将BCNF设计进一步分解为更高的规范形式来解决。这就是为什么我们总是要分解为5NF,然后如果需要显式反规范化。因此,任何非BCNF 3NF表都应该来自这样的反规范化。)

对于堆栈溢出来说,您的问题太广泛了。请编辑问题,将其限制为特定问题,并提供足够详细的信息,以确定适当的答案。避免同时问多个不同的问题。请参阅帮助页面以澄清此问题。@philipxy我正在使用Korth、Siborschatz和Sudershan的《数据库系统概念》一书。我能够理解BCNF分解,但无法理解何时不能保存FD。这本书说,有时它能保存,但有时它不能。还有,当需要保留FD时,你的第二个要点是:你的意思是,什么时候需要3NF而不是BCNF不保留FDs?这是一个常见问题。不仅在你的教科书(8.5.4第6版)中提到了这个问题,还有许多其他教科书和许多答案都用一个例子来说明这个问题。这说明了为什么你应该在一个问题中只问一个问题。尽管如此,我给出了比我发现的更全面的答案。