今日、私は3NF分解アルゴリズムについて読みました。
- Fの最小基底を見つけ、Gと言います
- Gの各FDX→Aについて、分解のリレーションの1つのスキーマとして{X、A}を使用します
- ステップ2のリレーションのセットのいずれもRのスーパーキーでない場合は、スキーマがR <のキーである別のリレーションを追加します。 / li>
この関係を3NFに分解したい。
R(A,B,C) S={A→B, A→C, B→A, B→C, C→A, C→ B, AB→ C, BC→A, AC→B, A→BC, B→AC, C→AB}
ご覧のとおり、Rのキーは次のとおりです。{A},{B},{C}
S には、次のようないくつかの最小基準があります。
-
{A→B, B→A, B→C, C→B}
;および -
{A→B, B→C, C→A}
問題は、最初の最小基底を使用する場合、Rを2つの関係に分解することです。 :(A、B)、(B、C)。
2番目の最小基底を使用すると、Rは(A、B)、(B、C)、(C、A)になります。
私の質問は次のとおりです:どちらが正しいですか?
回答
まず、各属性が素数であるため(実際には各属性がキーであるため)、元の関係はすでに第3正規形になっているため、3NFの定義が尊重されます。
次に、アルゴリズムが不完全であることに注意してください。手順は次のとおりです。
- Fの最小基底を見つけます。たとえばG
- 同じFDの各グループについて左側、X→A 1 、X→A 2 、…、X→A n in G、{X、Aを使用分解内の関係の1つのスキーマとしての 1 、A 2 、…、A n }
- 属性が別のリレーションに含まれているすべてのリレーションを削除します。
- ステップ2のリレーションのセットのいずれもRのスーパーキーでない場合は、スキーマがRのキーである別のリレーションを追加します。
したがって、最初のケースでは、依存関係の3つのグループを取得します。
A → B B → A B → C C → B
3つの関係R 1 (A、B)、R 2 (A、B、C)、R 3 (B、C)、そしてアルゴリズムに従って、結果として得られます他の2つには属性が含まれているため、R 2 のみです。
したがって、使用される最小ベースに応じて、アルゴリズムから2つの異なる出力があります(これは、最小カバーを計算するときに依存関係を考慮する順序)。
つまり、質問への回答:
which 1つは正しいですか?
は次のとおりです:両方とも正しい。どちらも3NFの定義を満たしているためです。 3NFでリレーションを分解するための合成アルゴリズムが、さまざまなソリューションを生成できることを発見しただけです。
別の質問は、どちらが「優れている」か、そしてもちろん、単一のリレーションを持つソリューションが「優れている」ことです。 、クエリを作成するときにテーブルを結合する必要がないためです。
もちろん、関係がすでに3NFにあるかどうかを最初に確認できれば、アルゴリズムの適用を回避できます。ただし、チェックでは関係の主要な属性を見つけるためにすべてのキーの指数計算が必要になるため、これは一般に実行できません。
A First Course in Database System - 3rd edition
という名前の本からアルゴリズムを取得しました。今、どちらに従うべきですか?