前回の続き
今回からテーブル設計についての話になります。
正規化と正規形
リレーショナルデータベースをここまでやってきて、おおよそテーブル構造についても想像できるようになったかとおもいます。
一方で、テーブルを作るということもやってきたわけですが、どのような手順でテーブルを設計していくべきかということをしっかりと確認していきたいと思います。
例えば、リレーショナルデータベースを知らない人がEXCELなどでデータを書き並べていった場合、あたりまえですがリレーショナルデータベースにふさわしくない形式になっているかと思います。
この形式を非正規形といいます。
データベース設計者はこの非正規形のデータベースをリレーショナルデータベースとして扱える形式である正規形に設計しなおす必要があります。
この正規形にリメイクする処理を、正規化というわけです。
正規化には、第1正規化から第5正規化までありますが、実務においてはほぼ第3正規化までが必須となっているので、本ブログでも第3正規化まで紹介することにいたします。
今回の内容はだ1正規化です。
第1正規化
上記でも触れましたが、非正規形のデータベースを第1正規形に変換することを第1正規化といいます。
第1正規化とは、以下の処理を行うものをいいます。
- 繰り返しのカラムを別テーブルに分離
- キーを設定
- 導出項目を削除
では、ひとつひとつ見ていきましょう。
繰り返しのカラムを別テーブルに分離
まず、非正規形のデータを確認してみましょう。 例えば、こんなデータを例とします。
注文番号 | 注文年月日 | 商品名 | 単価 | 数量 | 合計金額 | 商品名 | 単価 | 数量 | 合計金額 | 商品名 | 単価 | 数量 | 合計金額 | 顧客ID | 顧客名 | 顧客TEL | 顧客住所 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1001 | 2020/12/20 | うまい棒 | 10 | 3 | 30 | がりがりくん | 60 | 2 | 120 | チップスター | 150 | 1 | 150 | P501 | 岡氏 好男 | 0000-00-0000 | 東京都 |
1002 | 2020/12/21 | とまと | 90 | 2 | 180 | きゅうり | 21 | 30 | 60 | P905 | 野菜 好子 | 1111-11-1111 | 埼玉県 |
上記の形式だと商品名、単価、数量が繰り返し項目になっています。
なんで、これだとリレーショナルデータベースにとって好ましくないかというと、顧客が1回の買い物で商品を最大いくつかうかということは想像つかないからです。
リレーショナルデータベースは、テーブルごとのカラムを事前に用意しておいて、データとしてレコードを増やしていくとい構造です。
なので、上記は非正規形であるといえるのです。
上記を改善するとこんな感じです。
注文番号 | 注文年月日 | 商品ID | 商品名 | 単価 | 数量 | 合計金額 | 顧客ID | 顧客名 | 顧客TEL | 顧客住所 |
---|---|---|---|---|---|---|---|---|---|---|
1001 | 2020/12/20 | K101 | うまい棒 | 10 | 3 | 30 | P501 | 岡氏 好男 | 0000-00-0000 | 東京都 |
1001 | 2020/12/20 | K112 | がりがりくん | 60 | 2 | 120 | P501 | 岡氏 好男 | 0000-00-0000 | 東京都 |
1001 | 2020/12/20 | K126 | チップスター | 150 | 1 | 150 | P501 | 岡氏 好男 | 0000-00-0000 | 東京都 |
1002 | 2020/12/21 | Y516 | とまと | 90 | 2 | 180 | P905 | 野菜 好子 | 1111-11-1111 | 埼玉県 |
1002 | 2020/12/21 | Y842 | きゅうり | 30 | 3 | 90 | P905 | 野菜 好子 | 1111-11-1111 | 埼玉県 |
繰り返しカラムをまとめることができました。
キーの設定
上記の正規化過程で、商品IDカラムを追加しました。
非正規形のときは注文番号だけでユニークになったが、繰り返しカラムを除外することで、注文番号ともうひとつの2カラムでユニークにする必要があるためです。
※商品名のような名詞は必ずユニークになるとは言えないので、基本的にはキーに指定しません。
今回の場合、注文番号と商品IDでプライマリーキーに指定するのがよいでしょう。
導出項目を削除する。
導出項目とは、他のカラム(他のテーブルのカラムでもよい)を用いて算出できる値です。
つまり、ここでは単価と数量の積で求められる合計金額をさします。
わざわざカラムをつくらなくても、必要な時に演算させてあげればよいということです。
削除するとこんな感じになります。
注文番号 | 注文年月日 | 商品ID | 商品名 | 単価 | 数量 | 顧客ID | 顧客名 | 顧客TEL | 顧客住所 |
---|---|---|---|---|---|---|---|---|---|
1001 | 2020/12/20 | K101 | うまい棒 | 10 | 3 | P501 | 岡氏 好男 | 0000-00-0000 | 東京都 |
1001 | 2020/12/20 | K112 | がりがりくん | 60 | 2 | P501 | 岡氏 好男 | 0000-00-0000 | 東京都 |
1001 | 2020/12/20 | K126 | チップスター | 150 | 1 | P501 | 岡氏 好男 | 0000-00-0000 | 東京都 |
1002 | 2020/12/21 | Y516 | とまと | 90 | 2 | P905 | 野菜 好子 | 1111-11-1111 | 埼玉県 |
1002 | 2020/12/21 | Y842 | きゅうり | 30 | 3 | P905 | 野菜 好子 | 1111-11-1111 | 埼玉県 |
以上、今回はここまで。
次回は第2正規化をやります。