web-dev-qa-db-ja.com

2つの潜在的な主キーによる正規化

私は次のSTUDENT関係を第1正規形で持っています。ここでidは主キーとして識別されています(ここでemailもすべてのタプルに対して一意です):

STUDENT(id, email, first_name, last_name)

この関係/テーブルを第3正規形(3NF)になるように正規化したい。

上記のSTUDENT関係/テーブルから特定できた依存関係は次のとおりです

フル:

{ id } → { email }

推移的:

{ email } → { first_name, last_name }

これが私が混乱している部分です。主キー(email)で識別できるため、idは推移的な依存関係として識別しました。属性/列email自体がfirst_nameを識別および決定できますおよびlast_name

...このアイデアを続けようとすると、最終的には次のような3NFになります。

STUDENT(id, email)STUDENT_INFO(email, first_name, last_name)

ただし、ここでのSTUDENT関係/テーブルは非常に冗長に思われます、別の関係/テーブルを指すだけです。ここでの正規化プロセスは正しいですか?または、依存関係が間違っていましたか?最初のリレーション/テーブルに2つの候補キーがあり、どちらも主キーである可能性がある場合は常に、この問題が発生するようです(idまたはemailは、各行を一意に識別できます)。

2
Shnick

ここが本質的に私が間違ったところです:

推移的な依存関係について重要なことは、次の2つの重要な要素です。

  1. BがAに依存し、CがBに依存する場合、CもAに依存します(A→B→C)
  2. Bは候補キーではない(またはその一部)

私の例では、私は以下を推移的な依存関係として識別しました:

_{ email } → { first_name, last_name }
_

ただし、email候補キーであるため、これは当てはまりません。代わりに、idを主キーとして使用すると、完全な依存:

_{ id } → { email, first_name, last_name }
_
0
Shnick