BCNFと3NFの違い
BCNF定義の使用
依存関係X→Yのすべてについて、次の条件の少なくとも1つが当てはまる場合に限ります。
- X→Yは自明な関数従属性(Y⊆X)、または
- XはスキーマRのスーパーキーです
および3NFの定義
機能従属性X→Aのそれぞれについて、次の条件の少なくとも1つが当てはまる場合に限ります。
- XにAが含まれている(つまり、X→Aは自明な機能従属性です)、または
- Xはスーパーキー、または
- AXのすべての要素(AとXのセットの違い)は素数属性です(つまり、AXの各属性はいくつかの候補キーに含まれています)
簡単に言うと、次の違いがあります。
- BCNFの場合:すべての部分キー(プライム属性)はスーパーキーにのみ依存できますが、
一方
- 3NFの場合:部分キー(プライム属性)は、スーパーキーではない属性(つまり、別の部分キー/プライム属性または非プライム属性)にも依存する可能性があります。
どこ
- 主属性は、候補キーで見つかった属性であり、
- 候補キーは、その関係の最小限のスーパーキーであり、
- スーパーキーは、その変数に割り当てられたすべてのリレーションに、このセットの属性に同じ値を持つ2つの異なるタプル(行)がないことを保持するリレーション変数の属性のセットです。同様に、スーパーキーはスキーマのすべての属性が機能的に依存しているリレーションスキーマの属性のセットとして定義されます。(スーパーキーには常に候補キーが含まれます/候補キーは常にスーパーキーのサブセットです。リレーションに任意の属性を追加して、スーパーキーの1つを取得できます。)
つまり、候補キーの部分的なサブセット(完全なセットを除く重要なサブセット)は、スーパーキー以外のものに機能的に依存することはできません。
BCNFにないテーブル/リレーションは、別のユーザーによるピザの例で言及されている更新の異常などの異常の影響を受けます。不運にも、
- BNCFは常に取得できるとは限りませんが、
- 3NFはいつでも入手できます。
3NFとBCNFの例
違いの例は、現在Wikipediaの「3NFテーブルがBCNF(Boyce–Codd正規形)を満たしていない」にあります。次のテーブルは3NFを満たしていますが、「テニスコート」(部分的なキー/プライム属性)が依存しているため、BCNFは満たしていません。 「レートタイプ」(スーパーキーではない部分的なキー/プライム属性)について。これは、データベースのクライアントであるテニスクラブに尋ねることで判断できる依存関係です。
今日のテニスコートの予約(BCNFではなく3NF)
Court Start Time End Time Rate Type
------- ---------- -------- ---------
1 09:30 10:30 SAVER
1 11:00 12:00 SAVER
1 14:00 15:30 STANDARD
2 10:00 11:30 PREMIUM-B
2 11:30 13:30 PREMIUM-B
2 15:00 16:30 PREMIUM-A
テーブルのスーパーキーは次のとおりです。
S1 = {Court, Start Time}
S2 = {Court, End Time}
S3 = {Rate Type, Start Time}
S4 = {Rate Type, End Time}
S5 = {Court, Start Time, End Time}
S6 = {Rate Type, Start Time, End Time}
S7 = {Court, Rate Type, Start Time}
S8 = {Court, Rate Type, End Time}
ST = {Court, Rate Type, Start Time, End Time}, the trivial superkey
3NFの問題:部分的なキー/プライム属性「Court」は、スーパーキー以外のものに依存しています。代わりに、部分的なキー/プライム属性「レートタイプ」に依存します。つまり、コートをアップグレードする場合はユーザーがレートタイプを手動で変更する必要があり、レート変更を適用する場合は手動でコートを変更する必要があります。
- しかし、ユーザーがコートをアップグレードしたが、レートを上げることを覚えていない場合はどうなりますか?または、間違ったレートタイプが裁判所に適用された場合はどうなりますか?
(技術的には、「レートタイプ」->「コート」機能依存性に違反しないことを保証することはできません。)
BCNFソリューション:上記のテーブルをBCNFに配置する場合、指定されたリレーション/テーブルを次の2つのリレーション/テーブルに分解できます(レートタイプが裁判所とメンバーシップのステータスのみに依存することがわかっている場合、私たちのデータベースのクライアント、テニスクラブの所有者に尋ねることによって発見してください):
レートタイプ(BCNFおよびBCNFによって暗示されるより弱い3NF)
Rate Type Court Member Flag
--------- ----- -----------
SAVER 1 Yes
STANDARD 1 No
PREMIUM-A 2 Yes
PREMIUM-B 2 No
今日のテニスコートの予約(BCNFおよびBCNFによって暗示される弱い3NF)
Member Flag Court Start Time End Time
----------- ----- ---------- --------
Yes 1 09:30 10:30
Yes 1 11:00 12:00
No 1 14:00 15:30
No 2 10:00 11:30
No 2 11:30 13:30
Yes 2 15:00 16:30
解決した問題:裁判所をアップグレードすると、料金タイプにこの変更が反映されることを保証でき、裁判所に間違った価格を請求することはできません。
(技術的には、機能従属性「レートタイプ」->「コート」に違反しないことを保証できます。)