web-dev-qa-db-ja.com

データベースの通常の形式とは何ですか?例を挙げてください。

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

ほとんどの記事はやや技術的で理解しにくいため、1NF、2NF、3NF、さらには3.5NF(Boyce-Codd)の意味についての例に基づいて、わかりやすい説明を書くように依頼します。

265
barfoon

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列目はentireキーには依存しないからですが、その一部にすぎません。コース名はコースの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に依存していることが明らかになります。つまり、これはNFにはないです。これを修正するために、2NFで行ったのとほとんど同じことを行います - このテーブルからTeacherNameフィールドを取り出し、それをそれ自体に入れます。これはTeacherIDをキーとして持っています。

 Primary Key |

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

冗長性なし!

覚えておくべき1つの重要なことは、何かが1NFにない場合、それは2NFにも3NFにもないということです。そのため、追加の各正規形には、everythingとそれより低い正規形に必要な追加の条件、およびall成就する。

418
Smashery

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

データはキー[1NF]、キー全体[2NF]、キー[3NF]以外には依存しません。

115
Chris Shaffer

これは、素早い虐待されたの返事ですが、文章の中では:

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

2NF:他の列のために、あなたはあなたのテーブルのある列にデータを繰り返さない。

3NF:あなたのテーブルのすべての列はあなたのテーブルのキーにのみ関連しています - あなたはあなたのテーブルの中のキーではない別のカラムを説明するテーブルの中のカラムを持っていないでしょう。

詳しくは、ウィキペディアを参照してください。

44
Dave Markle

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

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

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

私はより詳細に記事を書きました ここ

31
Arcturus