【DB設計】第2正規形について調べてみた

DBの正規化とは

DBの正規化とはDB上のデータを重複なく保存するためにDBの構造やデータの持ち方を整えていくことです。

大切なことは、ゴールがDBのデータの重複をなくすということです。

正規化を行うことで、データ更新時のパフォーマンス向上やバグ削減を行えたり、DB上でのデータの矛盾を減らしたりすることができます。

ではここから、第2正規形についてご紹介してきます。

(なおここからDBはRDBを用いる前提で用語などを使用してきます)

 

第2正規形

※第1正規形に関してはこちらをご参照ください。

【DB設計】第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

このように修正することで、各テーブルのデータ全てが主キーに従属するようになりました。

ちなみにこのような状態を完全関数従属といいます。

完全関数従属にすることで、データを更新する際なとに更新漏れなどを防ぐことができます。

 

以上!!!!!!!