今回は、無駄のないデータベースを設計するための正規化について解説したいと思います。
データベースの正規化とは
正規化とは、データベースのデータ構造をより効率的で、重複や無駄のないシンプルな構造にするための手順です。
正規化されたデータベースを正規形と呼びます。
正規化には順番があり、非正規形から第一正規形、第二正規形、第三正規形という段階を踏みます。
正規化の目的(メリット)
正規化の目的は主に2つです。
- エンティティの独立性を高める
- データの整合性を高める
正規化のデメリット
正規化を進めれば進めるほど小さなテーブルが増えてしまい、パフォーマンスが低下してしまいます。
テーブルが増えれば関連するテーブルを検索するたびにSQLを実行する回数が増え、速度が低下するからです。
正規化の手順
第一正規形
第一正規形は重複するカラムをなくすことです。
例を見ていきましょう。
田中さんと鈴木さんがそれぞれ食べたフルーツのテーブルを作成しました。
id | name | fruits1 | fruits2 | fruits3 |
1 | 田中 | banana | orange | apple |
2 | 鈴木 | kiwi | grape | orange |
このテーブルを第一正規形で直していきましょう。
改めて記述すると、第一正規形は重複するカラムをなくすことです。
直すと以下のようになります。
id | name | fruits |
1 | 田中 | banana |
1 | 田中 | orange |
1 | 田中 | apple |
2 | 鈴木 | kiwi |
2 | 鈴木 | grape |
2 | 鈴木 | cherry |
第三正規形
第二正規形と第三正規形はとても似ているので、第二正規形は割愛して第三正規形を説明したいと思います。
第三正規形は属性ごとにテーブルを分けることです。
第一正規形まで直した以下のテーブルを第三正規形に直しましょう。
id | name | fruits |
1 | 田中 | banana |
1 | 田中 | orange |
1 | 田中 | apple |
2 | 鈴木 | kiwi |
2 | 鈴木 | grape |
2 | 鈴木 | cherry |
第三正規形まで直すと以下のようなテーブルになります。
人テーブル
id | name |
1 | 田中 |
2 | 鈴木 |
フルーツテーブル
fruits | name_id |
banana | 1 |
orange | 1 |
apple | 1 |
kiwi | 2 |
grape | 2 |
cherry | 2_ |
この先にも第四正規形・第五正規形がありますが、先述した通り、正規化しすぎるとパフォーマンスが低下するというデメリットが大きくなるので、第三正規形までが一般的です。
今回は無駄のないデータベースを設計するための正規化という技術を学びました。
データベース設計は初めは難しいと感じますが、慣れれば簡単です。
諦めずに頑張りましょう!