データベースの標準形式とは何ですか?例を挙げられますか?[閉まっている]


277

リレーショナルデータベースの設計には、データベースの正規化または単に正規化という概念があります。これは、列(属性)とテーブル(関係)を編成して、データの冗長性を減らし、データの整合性を向上させるプロセスです。(ウィキペディアに書かれているように)。

ほとんどの記事はやや技術的で理解が難しいため、1NF、2NF、3NF、さらには3.5NF(Boyce-Codd)の意味についての例に基づいて、理解しやすい説明を書いてほしいと思っています。

回答:


435

1NFは最も基本的な標準形式です。テーブルの各セルには1つの情報のみが含まれている必要があり、重複する行があってはなりません。

2NFと3NFはすべて、主キーに依存しているということです。主キーは複数の列で構成できることを思い出してください。クリスが彼の返答で言ったように:

データは、キー[1NF]、キー全体[2NF]に依存し、キー[3NF]のみに依存します(Coddを参考にしてください)。

2NF

特定の学期に受講したコースを含むテーブルがあり、次のデータがあるとします。

|-----Primary Key----|               uh oh |
                                           V
CourseID | SemesterID | #Places  | Course Name  |
------------------------------------------------|
IT101    |   2009-1   | 100      | Programming  |
IT101    |   2009-2   | 100      | Programming  |
IT102    |   2009-1   | 200      | Databases    |
IT102    |   2010-1   | 150      | Databases    |
IT103    |   2009-2   | 120      | Web Design   |

これは2NFではありません。4番目の列はキー全体に依存しているわけではなく、その一部のみに依存しているためです。コース名はコースのIDに依存しますが、どの学期に取り入れられるかとは関係ありません。したがって、ご覧のように、IT101がプログラミング中で、IT102がデータベースであることを示す複数の行があります。そこで、コース名を別のテーブルに移動して、CourseIDがENTIREキーになるように修正します。

Primary Key |

CourseID    |  Course Name |
---------------------------|
IT101       | Programming  |
IT102       | Databases    |
IT103       | Web Design   |

冗長性なし!

3NF

では、コースの教師の名前とその詳細もRDBMSに追加するとします。

|-----Primary Key----|                           uh oh |
                                                       V
Course  |  Semester  |  #Places   |  TeacherID  | TeacherName  |
---------------------------------------------------------------|
IT101   |   2009-1   |  100       |  332        |  Mr Jones    |
IT101   |   2009-2   |  100       |  332        |  Mr Jones    |
IT102   |   2009-1   |  200       |  495        |  Mr Bentley  |
IT102   |   2010-1   |  150       |  332        |  Mr Jones    |
IT103   |   2009-2   |  120       |  242        |  Mrs Smith   |

うまくいけば、TeacherNameがTeacherIDに依存していることは明らかであろう-したがって、これは3NFにない。これを修正するには、2NFで行ったのと同じように行います。このテーブルからTeacherNameフィールドを取り出して、TeacherIDをキーとして持つ独自のフィールドに入れます。

 Primary Key |

 TeacherID   | TeacherName  |
 ---------------------------|
 332         |  Mr Jones    |
 495         |  Mr Bentley  |
 242         |  Mrs Smith   |

冗長性なし!!

覚えておくべき重要なことの1つは、何かが1NFにない場合、2NFまたは3NFにもないということです。したがって、追加の各正規形には、下位の正規形が持つすべてのものが必要であり、さらにいくつかの追加の条件が必要です。これらはすべて満たす必要があります


9
物事の関係という観点から考えてみてください。「IDがIT101のコースの名前は何ですか?」と聞かれたら、答えてもらえますか。同様に、「ID 332を持っている先生は誰ですか?」それがどんな先生か教えてください。したがって、コース名はそのIDに依存します。
Smashery 2009

9
しかし、あなたは逆に行くことはできません-もし私があなたに「ジョーンズ氏のIDは何ですか?」ジョーンズ氏が2人いる可能性があるため、一意の答えを出すことができない場合があります。そのため、IDは名前に依存しません。IDに依存するのは名前です。
Smashery 2009

2
このように考えることもできます-3番目のテーブルを見てください(最初のテーブルにはTeacherNameが入っています)。最初の行に「ミスタージョーンズ」が表示されていて、2番目の行に「ミスターブログ」が表示されないようにするにはどうすればよいですか。私はべきではない、彼らは両方の332のIDを持っているので、それを行うことを許可する
Smashery

30
@instantsetsuna-完全な説明:一部の法廷では、「真実、真実全体、そして真実以外は何もないので、私を助けてください」と証人が尋ねる場合があります。あなたが真実を語っているのかどうかを知ることに関しては、神は権威を持つ者であると考えられています データベースの場合、「データはキー、キー全体に依存し、キーにのみ依存するので、コッドを助けて」と言うことができます。Ted Coddは、リレーショナルデータベース(キーに依存するものなど)のアイデアを思いついた人です。そのため、リレーショナルデータベースの場合は、彼が通じる権威になります。
Smashery

5
@Smashery 2NFと3NFの違いは何ですか?
Zoは2015

119

私は正確な言葉遣いのための良い記憶を持ったことがありませんが、私のデータベースクラスでは、教授は常に次のようなことを言ったと思います:

データは、キー[1NF]、キー全体[2NF]に依存し、キー[3NF]にのみ依存します。


72
...だから私はコッドを助けます。en.wikipedia.org/wiki/Ted_Codd
Smashery 2009

6
では、どう違いThe data depends on the key [1NF], nothing but the key [3NF]ますか?1センテンスの回答は回答を明確にしませんが、訪問者を混乱させるので、私たちを混同しないでください!
Pratik、2015年

2
「テーブルの各セルには情報が1つだけ含まれている必要があり、重複する行があってはなりません。」-「データはキーに依存している」がどのように一致するかわかりません。
Simon Forsberg、2017

46

迅速に、確かに屠殺された応答を以下に示します。

1NF:テーブルは順序付けされていないデータのセットとして編成され、繰り返し列はありません。

2NF:別の列があるため、テーブルの1つの列でデータを繰り返すことはありません。

3NF:テーブル内のすべての列は、テーブルのキーにのみ関連しています。テーブル内に、キーではない別の列を説明する列はありません。

詳細については、ウィキペディアを参照してください...


1
私の知る限り、1NFの繰り返しグループのスキューは繰り返し列ではなく、同じ属性の任意の数の繰り返し値を表す単一の、つまりアトミックではありません。これは、たとえば(1)stackoverflow.com/questions/23194292/…/(2)stackoverflow.com/questions/26357276/…–
underscore_d

34

1NF:列ごとに1つの値のみ

2NF:テーブル内のすべての非主キー列は、主キー全体に依存する必要があります。

3NF:テーブル内のすべての非主キー列は、主キー全体に直接依存する必要があります。

ここでもっと詳しく記事を書きまし


アトリビューションを提供しなかったため。私は帰属を提供するために答えを編集しました。
Robert Harvey、

可能な限り、答え自体に例を含めてください。カジュアルなユーザーは、ブログのリンクをクリックしなくても、あなたの回答を読んで価値を得ることができるはずです。つまり、答えは自己完結型である必要があります。
ロバートハーベイ、

それを覚えておきます。ありがとうございました:)
Arcturus

3
また、この質問は2年前のものであり、OPで承認済みとしてマークされた非常に支持された回答がすでにあります。遅い回答は、コミュニティによってより慎重に精査され、それらがOPに真の付加価値を追加するかどうかを評価します。
Robert Harvey、

3
@Arcturusはこの記事を読みましたが、正規化についての説明の1つになっています。
Olian04
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.