关系数据库中的BCNF / 3NF

时间:2011-10-16 00:16:13

标签: database relational-database relation 3nf

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

我正在读一本教科书,它告诉我你正在看三个主要属性,但我很难理解他们在说什么,或者至少应用他们所说的内容关系和FD。

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

  • A∈X;也就是说,它是一个普通的FD(∈意思是“在X中找到”)
  • X是超级钥匙
  • A是R
  • 的一些关键部分

前两位对应BCNF,而3NF则包括第三位。

1 个答案:

答案 0 :(得分:4)

本书SQL Antipatterns by Bill Karwin有一个关于BCNF和3NF的很好的例子,第303页有点复杂,但我相信比我迄今为止读到的差异的任何描述更简洁地指出差异。

  

例如,假设我们有三种标记类型:描述的标记   bug的影响,bug影响的子系统的标签和标签   描述bug的修复程序。我们决定每个bug都必须有   最多一个特定类型的标签。我们的候选键可能是bug_id加   tag,但它也可能是bug_idtag_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