First Normal Form(1NF)は、体系化されたデータベースの基本規則を設定します。
- 重複する列を同じ表から削除する。
- 関連するデータのグループごとに個別のテーブルを作成し、ユニークな列(プライマリキー)で各行を識別します。
これらのルールは、データベースの実際の設計を検討するときにはどういう意味ですか?実際には非常に簡単です。
重複をなくす
最初のルールは、テーブルの同じ行にデータを重複させてはいけないということです。データベース・コミュニティー内では、この概念を表の不可分性と呼びます。このルールに従うテーブルはアトミックであると言われています。典型的な例として、マネージャーと従属関係を格納する人事データベース内のテーブルを使用して、この原則を調べてみましょう。この例では、各マネージャーに1人以上の従業員がいるビジネスルールを適用し、各従業員には1人のマネージャーしか持たないようにします。
直感的に、この情報を追跡するためのリストやスプレッドシートを作成するときは、次のフィールドを持つ表を作成することがあります。
- マネージャー
- 下位1
- 下位2
- 下位3
- 下位4
しかし、1NFによって課せられた最初のルールを思い出してください。重複する列を同じテーブルから削除します。明らかに、Subordinate1-Subordinate4列は重複しています。このシナリオによって引き起こされた問題を熟考し、熟考してください。マネージャーに従属する従業員が1人しかいない場合、Subordinate2-Subordinate4列は単純に無駄なストレージスペース(貴重なデータベース商品)です。さらに、マネージャーがすでに4人の従業員を抱えている場合を想像してください。他の従業員を連れていくとどうなりますか?テーブル構造全体に変更が必要です。
現時点では、データベースの初心者にとって第2の明るいアイデアが通常発生します.1つ以上の列を持つことは望ましくなく、柔軟な量のデータ格納を可能にしたいと考えています。このようなものを試してみましょう:
- マネージャー
- 部下
従属フィールドには、「Mary、Bill、Joe」という形式の複数のエントリが含まれます。
この解決策はより近いですが、それはまたマークに足りません。従属列は依然として重複しており、非アトミックです。従属者を追加または削除する必要がある場合はどうなりますか?テーブルの内容全体を読み書きする必要があります。この状況ではそれほど大きな問題ではありませんが、1人のマネージャーが100人の従業員を抱えているとしたらどうでしょうか?また、将来のクエリでデータベースからデータを選択するプロセスが複雑になります。
ここに1NFの最初のルールを満たすテーブルがあります:
- マネージャー
- 下位
この場合、各従属者は1つのエントリを持ちますが、マネージャは複数のエントリを持つことができます。
主キーを特定する
次に、第2のルールはどうでしょうか?各行を一意の列または列のセット(主キー)で識別します。上の表を見て、従属列を主キーとして使用することをお勧めします。実際、従属列はプライマリキーの良い候補です。ビジネスルールによって各従属者にマネージャが1人しかないということが指定されているためです。しかし、私たちのテーブルに保存したデータは理想的ではありません。 Jimという別の従業員を雇うとどうなりますか?マネージャーと従属関係をどのようにデータベースに保存しますか?
一意の識別子(従業員IDなど)を主キーとして使用することをお勧めします。最終的なテーブルは次のようになります。
- マネージャID
- 従属ID
今、私たちのテーブルは最初の通常の形です!それ以外にも、さらに多くの組織について興奮している場合は、データベースをSecond Normal FormとThird Normal Formに入れるオプションがあります。