2

如何判断关系 R 是否在 BCNF 和 3NF 中?

我正在阅读一本教科书,它告诉我您正在查看 3 个主要属性,但我无法理解他们在说什么,或者至少在给定关系时应用他们所说的FD的。

3 个属性:给定关系 R 与属性 A,以及 X 是 R 的属性子集,对于 F 中的每个 FD X⟶A,以下陈述之一为真:

  • A ∈ X; 也就是说,它是一个平凡的 FD(ε 表示“在 X 中找到”)
  • X 是一个超级键
  • A 是 R 的某个键的一部分

前两个对应于 BCNF,3NF 包括第三个。

4

1 回答 1

4

Bill Karwin所著的SQL Antipatterns 一书在第 303 页上有一个关于 BCNF 和 3NF 的很好的示例,虽然有点复杂,但我相信比我迄今为止读过的任何对差异的描述都更简洁地指出了差异。

例如,假设我们有三种标记类型:描述错误影响的标记、错误影响的子系统的标记以及描述错误修复的标记。我们决定每个 bug 最多只能有一个特定类型的标签。我们的候选键可以是bug_idplus tag,但也可以是bug_idplus tag_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
于 2011-10-16T00:39:46.473 回答