【これだけ】SQLのテーブルの正規化【現役エンジニアが解説】
今回は、SQLのテーブルの正規化について、テーブルの正規化の方法と正規化をしない方法に分け、簡単に解説していきます。
テーブルの正規化の方法
データベースにおけるテーブルの正規化とは、一定のルールに基づいてテーブルを分けることです。
例えば、ブログのデータベースを考えると、最低限、記事データのテーブルだけがあれば良いように思えますよね。
しかし、WordPressのように書き込みユーザが複数いる場合やコメント機能を付ける場合には、ユーザテーブル、記事テーブル、コメントテーブル等、テーブルを分けた方が利用しやすくなります。
ユーザテーブルは記事テーブルと投稿者(ユーザ)の点で関係性があり、記事テーブルとコメントテーブルは記事ID(記事NO)の点で関係性があるため、共通項を各テーブルに持たせて運用していくことになります。
user_id | name |
---|---|
1 | 山田太郎 |
2 | 田中花子 |
3 | 小林一郎 |
WordPressのようにブログのデータベースを正規化する場合は、まず上記のようなユーザテーブルを作ります。
post_id | title | body | user_id |
---|---|---|---|
1 | 初投稿 | テスト投稿です。 | 1 |
2 | こんにちは | テスト投稿2です。 | 1 |
3 | はじめまして | テスト投稿3です。 | 2 |
そして、記事テーブルではuser_idをカラムとして持たせておくことで、ユーザ名を表示するときは、いつもユーザテーブルを参照しに行くという作りにします。
comment_id | comment | post_id |
---|---|---|
1 | 良い記事です。 | 1 |
2 | とても参考になりました。 | 1 |
3 | もっと簡潔に書いてほしい。 | 2 |
コメントテーブルも同様に、記事テーブルと共通のpost_idをカラムとして持たせておくことで、post_idごとにコメントを表示させることができます。
テーブルの正規化をしない方法
一方で、テーブルを正規化せずに、素直にそのままデータを持つ方法もあります。
先程の例で言えば、ユーザテーブルはわざわざ作らずに、記事テーブルの中にユーザ名を直接書き込んでしまうのです。
この方法は、エクセルで言えば、一つのシートに全てを集約させて管理する方法であり、複雑なつくりを避けることができます。
post_id | title | body | user_name |
---|---|---|---|
1 | 初投稿 | テスト投稿です。 | 山田太郎 |
2 | こんにちは | テスト投稿2です。 | 田中花子 |
3 | はじめまして | テスト投稿3です。 | 小林一郎 |
ブログのデータベースの例では、このように記事テーブルにユーザ名を直接入れ込んでしまいます。
コメントに関しては、どうしてもコメントテーブルを作って正規化しないとおそらく上手くいかないと思います。
テーブルを正規化すべきかどうか
テーブルは正規化しなくてもなんとか運用していけることが多いですから、正規化するしないで悩む方もいらっしゃるでしょう。
正規化のメリットとしては、データを一定のルールでそれぞれ別々のテーブルで管理することでメンテナンス性を高めることができます。
例えば、山田花子さんが田中花子さんに名前が変わったときに、正規化しておけば一つのテーブルの情報を変更するだけで全てが変わるので楽です。
一方、正規化のデメリットとしては、あるテーブルの情報を一度変えてしまうと、そのテーブルを利用している箇所全てで情報が変わってしまいます。
例えば、税率テーブルで各税率の管理をしていたとして、消費税を10%から15%に変えてしまうと、10%だった当時の過去分の売上履歴テーブルの税率も全て一律で変わってしまう可能性があります。
もちろんこのような場合には、税率期間のカラムを追加して消費税を管理することや、売上履歴テーブルのようなものは正規化しないで直接データを入れて管理する等の対策が考えられますが、いずれにしても正規化にはこうしたメリットとデメリットが存在するので、それを理解したうえで正規化するかしないかを判断されると良いと思います。