テクノロジー

2018年12月28日
  • #テーブル正規化
  • #Rails

テーブルの正規化を学ぼう

Aws4 request&x amz signedheaders=host&x amz signature=b4cea36a202c5a8e5a023864e273ad1fa6a57bc3fb50280ac6e72a8cf1a099a0

データの無駄を省くテーブルの正規化を学ぼう

今回は、データ管理の基本的な手法の一つであるテーブルの正規化について解説をします。
効果的に学習を進めるためのお役に立つことができましたら、幸いです。

テーブルの 正規化 とは 余計なデータを取り除いた状態 にすることです。
余計なデータとは 同じデータが重複 していることを指します。
テーブルに関して何も手をつけていない状態を 非正規形 といい、そこから 第一正規形 第二正規形 第三正規形 と言います。
テーブルの正規化をするメリットは 管理をしやすくする ことです。

今回は以下のようなテーブルを例に正規化を行っていきます。

(取引テーブル)

trans email name live product_name product_price product_name product_price
1 aaa@hoge.com aaa 埼玉県 扇風機 20000 ケトル 3500
2 bbb@hoge.com bbb 東京都 掃除機 30000 扇風機 20000
3 ccc@hoge.com ccc 東京都 ケトル 3500 テレビ 60000
4 ddd@hoge.com ddd 東京都 掃除機 30000 テレビ 60000

第一正規化

第一正規化とは テーブルの列に関するムダの取り除き をした形のことです。
この例だと product_nameproduct_price というカラムが重複しています。
それを防ぐため以下のようにします。

(取引テーブル)

id email name live product_name product_price
1 aaa@hoge.com aaa 埼玉県 扇風機 20000
2 aaa@hoge.com aaa 埼玉県 ケトル 3500
3 bbb@hoge.com bbb 東京都 掃除機 30000
4 bbb@hoge.com bbb 東京都 扇風機 20000
5 ccc@hoge.com ccc 東京都 ケトル 3500
6 ccc@hoge.com ccc 東京都 テレビ 60000
7 ddd@hoge.com ddd 東京都 掃除機 30000
8 ddd@hoge.com ddd 東京都 テレビ 60000

これによって product_nameproduct_price が重複しないようになりました。

第二正規化

第二正規化とは 主キーに関する部分を別テーブルに切り出し た形のことです。
この例だと、transというキーはユーザと商品を取りまとめる役割を持っています。
そのためユーザと商品は別のテーブルに切り出すことで、重複を防ぐことができます。

具体的には以下のように切り出します。

(カスタマーテーブル)

id email name live
1 aaa@hoge.com aaa 埼玉県
2 bbb@hoge.com bbb 東京都
3 ccc@hoge.com ccc 東京都
4 ddd@hoge.com ddd 東京都

(商品テーブル)

id name price
1 扇風機 20000
2 ケトル 3500
3 掃除機 30000
4 テレビ 60000

(取引テーブル)

id user_id product_id
1 1 1
2 1 2
3 2 3
4 2 1
5 3 2
6 3 4
7 4 3
8 4 4

第三正規化

第三正規化とは 主キー以外に関する部分を別テーブルに切り出し た形のことです。
この例だと、カスタマーテーブルの live というカラムに重複があるのを確認できると思います。
ここを 都道府県 テーブルとして切り出します。

(カスタマーテーブル)

id email name prefecture_id
1 aaa@hoge.com aaa 2
2 bbb@hoge.com bbb 1
3 ccc@hoge.com ccc 1
4 ddd@hoge.com ddd 1

(都道府県テーブル)

id name
1 東京都
2 埼玉県
3 千葉県

以上でテーブルの正規化に関しての説明を終了します。

いかがでしょうか?
データの正規化は「データベースを管理する上で、必要な項目を整理・管理をしやすくする事」を目的に行います。
テーブルを扱う上で必須とも言える知識ですので、ぜひご理解をお深めください。

DIVE INTO CODEのことをもっと知ってみませんか?