我读过这句话: data depends on the key [1NF], the whole key [2NF] and nothing but the key [3NF]美元.

然而,我很难理解3.5NF或BCNF.以下是我的理解:

  • BCNF比3NF更严格
  • 表中任何FD的左侧都必须是超键(或至少是候选键)

那么,为什么有些3NF表不在BCNF中呢?我的意思是,3NF引语明确地说"除了键什么都没有",这意味着所有属性都完全依赖于主键.毕竟,在 Select 主键作为我们的主键之前,主键一直是候选键.

到目前为止,如果我的理解有任何问题,请纠正我,并感谢您能提供的任何帮助.

推荐答案

你的披萨可以有三种配料类型:

  • 一种cheese
  • 一种肉
  • 一种蔬菜

因此,我们订购了两个披萨,并 Select 以下配料:

Pizza    Topping     Topping Type
-------- ----------  -------------
1        mozzarella  cheese
1        pepperoni   meat
1        olives      vegetable
2        mozzarella  meat
2        sausage     cheese
2        peppers     vegetable

等等,马苏里拉cheese 不可能既是cheese 又是肉!而且香肠也不是cheese !

我们需要防止这类错误,让mozzarella always成为cheese .我们应该使用一个单独的表格,所以我们只在一个地方写下这个事实.

Pizza    Topping
-------- ----------
1        mozzarella
1        pepperoni
1        olives
2        mozzarella 
2        sausage
2        peppers

Topping     Topping Type
----------  -------------
mozzarella  cheese
pepperoni   meat
olives      vegetable
sausage     meat
peppers     vegetable

这是一个8岁的子元素可能会理解的解释.以下是更具技术性的版本.

BCNF acts differently from 3NF only when there are multiple overlapping candidate keys.

原因是如果YX的子集,则函数依赖X -> Y当然是真的.因此,在任何只有一个候选键且在3NF中的表中,它已经在BCNF中,因为没有列(键或非键)在功能上依赖于除该键之外的任何列.

因 for each 披萨都必须有一种配料类型,所以我们知道(披萨,配料类型)是一个候选键.我们也直观地知道,一个给定的浇头不能同时属于不同的类型.所以(披萨、配料)必须是独一无二的,因此也是候选的关键.所以我们有两个重叠的候选键.

我显示了一个异常情况,我们把莫扎里拉cheese 标记为错误的配料类型.我们知道这是错误的,但是使其错误的规则是依赖项Topping -> Topping Type,该依赖项不是该表的BCNF的有效依赖项.它依赖于不同于整个候选密钥的东西.

因此,为了解决这个问题,我们将Topping Type从披萨表中删除,并使其成为TOPINGS表中的非键属性.

Database相关问答推荐

Mongo DB使用一对多关系离开JOIN

为多个列 Select 最新的非空值

如何让 Google Drive Electron 表格像 MySQL 数据库一样工作吗?

如何使用存储在数据库表中的属性配置 Spring bean

如果我使用存储过程,我对 SQL 注入免疫吗?

Java中基于文件的数据库

数据验证是否应该在数据库级别进行?

是否可以使用 Mongo 的 Object ID作为其唯一标识符?如果是这样,如何将其转换为字符串并按字符串查找?

SQLite 如果列存在

我可以为 dapper-dot-net 映射指定数据库列名称吗?

在 MySQL 中查看表以进行更改?

按最强 LIKE 排序 SQL?

在 SQL 数据库之间共享数据

friendship数据库模式

在 Heroku 生产站点上清除 Rails 应用程序数据库

如何处理数据库中用户的身份验证/授权?

如何在 SQL Server 中总结时间字段

Python中的内存数据库

Apache Spark 的主键

在 UI 中执行业务逻辑的单元测试数据库应用程序