この関係を3NF関係に分解する方法は?

今日、私は3NF分解アルゴリズムについて読みました。

  1. Fの最小基底を見つけ、Gと言います
  2. Gの各FDX→Aについて、分解のリレーションの1つのスキーマとして{X、A}を使用します
  3. ステップ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 には、次のようないくつかの最小基準があります。

  1. {A→B, B→A, B→C, C→B};および
  2. {A→B, B→C, C→A}

問題は、最初の最小基底を使用する場合、Rを2つの関係に分解することです。 :(A、B)、(B、C)。

2番目の最小基底を使用すると、Rは(A、B)、(B、C)、(C、A)になります。

私の質問は次のとおりです:どちらが正しいですか?

回答

まず、各属性が素数であるため(実際には各属性がキーであるため)、元の関係はすでに第3正規形になっているため、3NFの定義が尊重されます。

次に、アルゴリズムが不完全であることに注意してください。手順は次のとおりです。

  1. Fの最小基底を見つけます。たとえばG
  2. 同じFDの各グループについて左側、X→A 1 、X→A 2 、…、X→A n in G、{X、Aを使用分解内の関係の1つのスキーマとしての 1 、A 2 、…、A n }
  3. 属性が別のリレーションに含まれているすべてのリレーションを削除します。
  4. ステップ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にあるかどうかを最初に確認できれば、アルゴリズムの適用を回避できます。ただし、チェックでは関係の主要な属性を見つけるためにすべてのキーの指数計算が必要になるため、これは一般に実行できません。

コメント

  • ご回答ありがとうございます。しかし、R1(A、B)、R2(A、B、C)、R3(B、C)の3つの関係をどのように作成しましたか? R1とR3しかないと思いました。 R2は元の関係です。
  • 正しいアルゴリズムの2番目のステップでは、同じ左側の部分にB→AとB→Cの2つの依存関係があるため、すべての属性をまとめて取得する必要があります。関係(A、B、C)。アルゴリズムによって決定されるだけです。
  • うわー、'その2番目のステップについて知りませんでした。 A First Course in Database System - 3rd editionという名前の本からアルゴリズムを取得しました。今、どちらに従うべきですか?
  • そのアルゴリズムは完全ではありません。データベースに関するすべての主要な本には、私が回答で説明したアルゴリズムがあります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です