web-dev-qa-db-ja.com

リレーションをBCNFに変換する

BCNFに変換するには、すべての違反を考慮に入れ、必要に応じて各FDで分解する必要があることを理解しています。

たとえば、FDのAB-> C、B-> D、C-> Aを持つR(A、B、C、D)があった場合。それぞれのクロージャーを計算できます、{AB} + = ABCD、{B} + = BD、{C} + =CA。

アルゴリズムを実行した後、BCNFへの有効な分解は、R1(B、D)、R2(C、A)、R3(B、C)になります。

私が混乱しているのは、この分解はアルゴリズムに従って正しいようですが、最初の機能依存関係AB-> Cが満たされていないように見える場合、どのようにして正しいのでしょうか。

1
SS'

分解したスキーマがBCNFにあるという意味で、作成した分解は事実上正しいものです。

ただし、すでに説明したように、依存関係は保持されません。特に、依存関係_AB → C_は失われます。

これで、BCNFの分解に関する重要なポイントを再発見しました。BCNFでは常に関係を分解できますが、1つ以上の依存関係が失われることもあります。

これは実際にはどういう意味ですか? (おそらく重要な)制約を失う可能性があります。この場合、たとえば、値の各ペアABに常に1つの値Cがあるという制約は、結果のスキーマに適用できません。

これのために何かできますか?さて、3NFに使用される合成アルゴリズムは常にロスレスで機能的な依存関係を維持する分解を生成することが保証されているため、代わりに3NFで分解することができます。この場合、たとえば、すべての依存関係を維持する分解R1(A B C)およびR2(B D)が生成されます。

しかし、ちょっと待ってください!依存関係_C → A_があるため、特定の値があるたびにAの値が同じになるため、BCNFアルゴリズムで排除されたすべての冗長性を排除しない分解ができました。 Cの場合。

したがって、ここでジレンマがあります。冗長性を維持する代わりに依存関係を維持する3NFを選択する必要がありますか、それともデータの「意味」を失うことを犠牲にして冗長性を減らすBCNFを選択する必要がありますか?

多くの人の意見では、データの冗長性よりもデータの意味が重要であると考えられているため(そしてこれだけでなく、3NFアルゴリズムは多項式アルゴリズムであり、BCNFアルゴリズムは指数関数的であるため)、3NFを選択する必要があるとのことです。

2
Renzo