BCNF何时不保留功能依赖性,那么我应该使用3NF吗?

时间:2017-10-02 10:52:35

标签: database database-normalization functional-dependencies 3nf bcnf

  • BCNF何时无法保留功能依赖?
  • 何时需要3NF分解而不是保留功能依赖性的BCNF分解?

请举例说明。

我看到了这个问题,但它没有回答我的问题:
Decomposition that does not preserve functional dependency

1 个答案:

答案 0 :(得分:0)

  
      
  • BCNF何时无法保留功能依赖?
  •   

事实证明,这个问题在某种程度上是有问题的,而且你定义了素数'但是数字素数?"是的,但是,你确定了最简单的分数形式"但是最简单形式的分数?" ISN'吨。 定义"何时" 。但是你意味着是什么样的,多个条件适用,那么更简单/直观的定义非暴力算法是什么特征呢?但是已经证明(非正式地)没有非指数/非穷举算法来枚举BCNF分解,这些分解不会保留FD(功能依赖性)。

  
      
  • 何时需要3NF分解而不是BCNF分解[not]保留功能依赖性?
  •   

如果3NF设计不在BCNF中,那么它会保留一个不在超级密钥之外的FD,因此在大多数SQL DBMS中都不能以声明方式强制执行。但是BCNF设计没有保留FD,需要强制执行的约束相当于两个SQL FK(foreign key)约束,这些约束在大多数SQL DBMS中都不能以声明方式强制执行。由于防止DBMS执行它们的周期没有什么特别之处,并且这两种设计可以相互代表,因此DBMS无法支持这两种设计本身没有任何理由。

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

  

因此,如果我们无法获得依赖于保留的BCNF分解,通常最好选择BCNF,因为在SQL中检查除主键约束之外的功能依赖性是很困难的。
   - 数据库系统概念第6版(2011),作者:Silberschatz,Korth&苏达

你可以在大多数教科书中找到一个面对这个选择的例子,有几十个在线用pdf。它必须涉及重叠(复合)CK(候选键)。

  

SJT元组( s j t )的含义 - 简化符号 - 是学生 s 由教师 t 授课 j 。以下限制适用:

     
      
  • 对于每个科目,该科目的每个学生只由一名教师授课
  •   
  • 每位教师只教一门科目(但每门科目都由几位老师教授)。
  •   
     

[...]从第一个约束,我们有FD {S,J}→T。从第二个约束,我们有FD T→J。    - 数据库系统简介第8版(2004年)按日期

(3NF设计可能会遇到进一步将BCNF设计分解为更高的正常形式而消除的问题。这就是为什么我们应该总是分解为5NF,然后如果需要明确地反规范化。所以任何非BCNF 3NF表都应该来自这种非规范化。)