プログラ生活

プログラム初学者のためのポイントを書いていこうと思います。たまに脇道それた記事もありますが、息抜きだとおもって気長にお付き合いください。

【SQL Server(連載)】正規化(第1正規化) -34-

www.pon-x.jp

前回の続き

今回からテーブル設計についての話になります。

正規化と正規形

リレーショナルデータベースをここまでやってきて、おおよそテーブル構造についても想像できるようになったかとおもいます。
一方で、テーブルを作るということもやってきたわけですが、どのような手順でテーブルを設計していくべきかということをしっかりと確認していきたいと思います。

例えば、リレーショナルデータベースを知らない人がEXCELなどでデータを書き並べていった場合、あたりまえですがリレーショナルデータベースにふさわしくない形式になっているかと思います。
この形式を非正規形といいます。
データベース設計者はこの非正規形のデータベースをリレーショナルデータベースとして扱える形式である正規形に設計しなおす必要があります。
この正規形にリメイクする処理を、正規化というわけです。

正規化には、第1正規化から第5正規化までありますが、実務においてはほぼ第3正規化までが必須となっているので、本ブログでも第3正規化まで紹介することにいたします。

今回の内容はだ1正規化です。

第1正規化

上記でも触れましたが、非正規形のデータベースを第1正規形に変換することを第1正規化といいます。

第1正規化とは、以下の処理を行うものをいいます。

  1. 繰り返しのカラムを別テーブルに分離
  2. キーを設定
  3. 導出項目を削除

では、ひとつひとつ見ていきましょう。

繰り返しのカラムを別テーブルに分離

まず、非正規形のデータを確認してみましょう。 例えば、こんなデータを例とします。

注文番号 注文年月日 商品名 単価 数量 合計金額 商品名 単価 数量 合計金額 商品名 単価 数量 合計金額 顧客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正規化をやります。