【DB設計】第2正規形について調べてみた
DBの正規化とは
DBの正規化とはDB上のデータを重複なく保存するためにDBの構造やデータの持ち方を整えていくことです。
大切なことは、ゴールがDBのデータの重複をなくすということです。
正規化を行うことで、データ更新時のパフォーマンス向上やバグ削減を行えたり、DB上でのデータの矛盾を減らしたりすることができます。
ではここから、第2正規形についてご紹介してきます。
(なおここからDBはRDBを用いる前提で用語などを使用してきます)
第2正規形
※第1正規形に関してはこちらをご参照ください。
考え方
第2正規形のゴールは「テーブル内に部分関数従属を無くす」ということです。
部分関数従属を説明するためには、関数従属性という考え方を理解する必要があるので、まずは関数従属性をご紹介します。
関数従属性
関数従属性とは1つの値が決まればもう1つの値が決定する関係性のことをいいます。
わかりやすく数学を用いると、y=5xにおけるxが決まればyの値が決まる関係性のことです。
これをDB設計に置き換えると、主キーが決まればそれに従属する値が決まる関係のことになります。
これがDB設計における関数従属性になります。
部分関数従属
関数従属性の説明が終わったので、部分関数従属についてご説明します。
部分関数従属とは、複数の主キーに対して一部の主キーにのみ従属する列があることをいいます。
わかりにくいので具体例を用いてご説明します。
具体例
以下は、国ごとにユーザーIDが割り当てられるテーブルだと想定してください。
国ID(PK) | 国名 | ユーザーID(PK) | ユーザー名 | 年齢 |
1 | アメリカ | 1 | Tom | 23 |
2 | 日本 | 1 | 佐藤 | 23 |
このテーブルでは国IDとユーザーIDを主キーとすることで、レコードを特定しています。
しかし、国名に注目してください。
国名は、国IDとユーザーIDの組み合わせで決まるというよりも国ID1つで決定されるものになります。
これが、上記の「複数の主キーに対して一部の主キーにのみ従属する列がある」状態になります。
この形だと第2正規形に反しているので、全ての列が主キーに従属しているような関係に修正します。
修正
修正方法として、国データを別テーブルとして切り出します。
国テーブル
国ID(PK) | 国名 |
1 | アメリカ |
2 | 日本 |
ユーザーテーブル
国ID(PK) | ユーザーID(PK) | ユーザー名 | 年齢 |
1 | 1 | Tom | 23 |
2 | 1 | 佐藤 | 23 |
このように修正することで、各テーブルのデータ全てが主キーに従属するようになりました。
ちなみにこのような状態を完全関数従属といいます。
完全関数従属にすることで、データを更新する際なとに更新漏れなどを防ぐことができます。
以上!!!!!!!