BillKarwinによる本SQLAntipatternsには、303ページのBCNFと3NFに関する良い例がありますが、これは少し複雑ですが、これまで読んだ違いの説明よりも簡潔に違いを指摘していると思います。
たとえば、バグの影響を説明するタグ、バグが影響を与えるサブシステムのタグ、バグの修正を説明するタグの3つのタグタイプがあるとします。各バグには、特定のタイプのタグを最大1つ含める必要があると判断しました。候補キーは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を満たす2つのテーブルに変更します。
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