2010-12-30 16 views
0

どのように私は重複するタプルを持つテーブルを正規化するだろうか?SQLの正規化

-------------------------------------- 
ID | Name | Email 
----------------------------------------- 
1  | John | [email protected] 
2  | John | [email protected] 

この場合、2人のユーザーが同じ名前とメールアドレスを持っています。

+8

問題の詳細を説明することから始めます。 –

+0

私は正規化プロセスについて読みましたが、どうすれば使用できますか?正規化コマンドがありませんか? – brax

+1

「正規化コマンド」があった場合、すべてのデータベースは正規化されます。それより少し複雑です。 – cHao

答えて

2

Brax:まず、テーブルが記述しているエンティティをよく見てください。重複情報は、同じテーブルに2つ(またはそれ以上)のエンティティを格納するという共通の兆候です。次にこれらを分割します。固有の値を見つけるために、group by、distinct、またはいくつかのアプリケーションロジックを使用してクエリを記述します。必要に応じて一意の制約を使用してこれを確認してください。これらのエンティティにプライマリキーがあることを確認します。

2番目:既存のテーブルに外部キー列を追加して、作成したばかりの新しいテーブルとの関係を形成できるようにします。外部キーテーブルを入力します。

第3:オフロードしたばかりの情報を含む列を別のエンティティテーブルにドロップします。

あなたの質問は非常に一般的なので、この回答もありますが、少なくとも少しは役立ちます。

3

タプが重複している場合、プライマリキーを持つことはできません。これは最初の正規形に必要です。

0

タプルを構成するフィールドを主キーにします。

0

これらのユーザーは同じ人物と見なされますか?おそらくユーザー1が登録され、その電子メールアドレスが破棄されたか誤って入力された場合、ユーザー2は同じ詳細を使用した)。それらが異なる人物であると思われる場合は、それらを一意に識別するために追加のデータを追加する必要があります。登録日。

2人のユーザーが同じ人物であると仮定して、まず2つの行のどちらを保持するかを決めます(たとえば、IDが最も小さいものを選択します)。次に、削除する行を参照する他の表の行をすべて検索します(この場合は2)。これらの外部キーをすべて更新し、代わりに1を指すようにします。次に、ID = 2の行を削除することができます。

これでデータが整理されましたので、スキーマを修正して再度これが起きないようにする必要があります。名前と電子メールに一意の制約を入れてください同じ電子メールを2人で使用することを許可しない場合は、電子メールで)。