web-dev-qa-db-ja.com

機能依存関係からの候補キー

ABCDE属性を持つ関係Rが与えられます。次の依存関係が与えられます:A-> B、BC-> E、およびED->A。すでにCDE、ACD、およびBCDという答えがあります。それを行う方法を知っている必要があります。ありがとう。

26
ranzy

候補キーは最小限のスーパーキーです。つまり、キーに余分な属性はありません。候補キーを見つける最初のステップは、すべてのスーパーキーを見つけることです。馴染みのない人にとって、スーパーキーは、すべての属性のセットが閉じられた属性のセットです。言い換えると、スーパーキーは開始できる属性のセットであり、機能の依存関係に従うと、すべての属性を含むセットにつながります。

機能的な依存関係があるため、A-> B、BC-> E、およびED-> Aなので、次のスーパーキーがあります。

  • ABCDE(すべての属性は常にスーパーキーです)
  • BCED(属性AはED-> Aで取得できます)
  • ACDE(AからBを追加するだけ-> B)
  • ABCD(BCからEを追加するだけ-> E)
  • ACD(A-> Bを介してBを取得でき、次にBC-> Eを介してEを取得できます)
  • BCD(BC-> E、次にED-> AからAでEを取得できます)
  • CDE(AはED-> A、次にBはA-> Bから取得できます)

(ここで理解する1つのトリックは、CとDが関数の依存関係の右側に表示されないため、すべてのキーにCとDの両方が含まれている必要があることです)

スーパーキーがすべて揃ったので、最後の3つだけが候補キーであることがわかります。最初の4つはすべて削減できるため。ただし、最後の3つのスーパーキーから属性を削除して、スーパーキーのままにすることはできません。

したがって、候補キーは、ACD、BCD、およびCDEです。

それが役に立てば幸い

67
lbrendanl

候補キーを見つけるには、FDを属性を左、中央、右に分割する必要があります-左には、左側にのみ表示される属性(CD)が含まれます-中央には、左と右の両方に表示される属性が含まれます( ABE)-右には、右側にのみ表示される属性が含まれます(なし)

次に、左から属性のクロージャを見つけます。* CD +-> CDリレーションのすべての属性を取得するわけではないので、ミドル属性(ABE)を一度に1つずつ追加して、クロージャをもう一度探します。

したがって:* CDA +-> CDABE(CDAは候補キー)* CDB +-> CDBEA(CDBは候補キー)* CDE +-> CDEAB(CDEは候補キー)

10
Agustin

アルゴリズムを使用します。

1.任意の属性または属性のセットを取る

例:ACD

2.最初に言及した機能依存関係を取得する

例:A-> B

3.依存関係のL.H.Sは、手順1で選択した属性のサブセットですか?

はいの場合、機能依存関係のR.H.Sを属性に追加します。いいえの場合、この機能の依存関係は無視してください。

例:AはACDのサブセットです。したがって、ACDにBを追加します。 ACDはABCDになりました

4.次に、次の機能依存関係に進みます。ステップ3を繰り返します。

例:BC-> E BCはABCDのサブセットです。 ABCDはABCDEになりました

5.これですべての属性を取得したら、停止できます。

すべての属性がない場合は、次の機能の依存関係に進み、手順3を繰り返します。最後の機能の依存関係に到達し、すべての属性がない場合は、最初の機能の依存関係に戻って、手順3と4を繰り返します。 。ステップ3で繰り返した機能依存関係に関係なく、変更していない属性のセットがなくなるまで、このループを循環させます。

例:属性セットACDのABCDEがあるため、停止できます。

すべての属性がある場合、スーパーキーがあります。例:私がABCDEを持っているので、ACDはスーパーキーです。

1
rubixphys12