如何判断关系 R 是否在 BCNF 和 3NF 中?
我正在阅读一本教科书,它告诉我您正在查看 3 个主要属性,但我无法理解他们在说什么,或者至少在给定关系时应用他们所说的FD的。
3 个属性:给定关系 R 与属性 A,以及 X 是 R 的属性子集,对于 F 中的每个 FD X⟶A,以下陈述之一为真:
- A ∈ X; 也就是说,它是一个平凡的 FD(ε 表示“在 X 中找到”)
- X 是一个超级键
- A 是 R 的某个键的一部分
前两个对应于 BCNF,3NF 包括第三个。
如何判断关系 R 是否在 BCNF 和 3NF 中?
我正在阅读一本教科书,它告诉我您正在查看 3 个主要属性,但我无法理解他们在说什么,或者至少在给定关系时应用他们所说的FD的。
3 个属性:给定关系 R 与属性 A,以及 X 是 R 的属性子集,对于 F 中的每个 FD X⟶A,以下陈述之一为真:
前两个对应于 BCNF,3NF 包括第三个。
Bill Karwin所著的SQL Antipatterns 一书在第 303 页上有一个关于 BCNF 和 3NF 的很好的示例,虽然有点复杂,但我相信比我迄今为止读过的任何对差异的描述都更简洁地指出了差异。
例如,假设我们有三种标记类型:描述错误影响的标记、错误影响的子系统的标记以及描述错误修复的标记。我们决定每个 bug 最多只能有一个特定类型的标签。我们的候选键可以是
bug_id
plustag
,但也可以是bug_id
plustag_type
。任何一对列都足够具体,可以单独处理每一行。bug_id tag tag_type ------------------------ 1234 crash impact 3456 printing subsystem 3456 crash impact 5678 report subsystem 5678 crash impact 5678 data fix
然后本书将这个单表(满足 3NF)改成两个满足 BCNF 的表:
bug_id tag ---------- 1234 crash 3456 printing 3456 crash 5678 report 5678 crash 5678 data tag tag_type ------------------ crash impact printing subsystem report subsystem data fix