如何判断关系R是否在BCNF和3NF?
我正在读一本教科书,它告诉我你正在看三个主要属性,但我很难理解他们在说什么,或者至少应用他们所说的内容关系和FD。
3个属性: 给定R与属性A的关系,X为R的属性子集,对于F中的每个FDX⟶A,以下陈述之一为真:
前两位对应BCNF,而3NF则包括第三位。
答案 0 :(得分:4)
本书SQL Antipatterns by Bill Karwin有一个关于BCNF和3NF的很好的例子,第303页有点复杂,但我相信比我迄今为止读到的差异的任何描述更简洁地指出差异。
例如,假设我们有三种标记类型:描述的标记 bug的影响,bug影响的子系统的标签和标签 描述bug的修复程序。我们决定每个bug都必须有 最多一个特定类型的标签。我们的候选键可能是
bug_id
加tag
,但它也可能是bug_id
加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