前回、結合について説明しました。正規化すると共通のデータがコード化され、マスタとして管理できる事は理解頂いたと思いますが、逆に正規化した事によって弊害が出る場合があります。
今回は、正規化するべきデータと正規化してはいけないデータについて解説します。
前回にも出ました、コード化した注文データです。
コード化前のデータ
日付 | 会社名 | 部署 | 商品 | 単価 | 個数 | 金額 |
---|---|---|---|---|---|---|
2014/01/22 | あいう商事 | 東京支店 | まみむめもセット(工業用) | 2,500円 | 20個 | 50,000円 |
2014/01/22 | かきく会社 | 大阪営業所 | まみむめもセット(工業用) | 2,500円 | 50個 | 125,000円 |
2014/01/23 | あいう商事 | 大阪支店 | わをんパック(大型) | 5,800円 | 30個 | 174,000円 |
2014/01/24 | さしす工業 | 浦和工場 | なにぬねのセット | 1,500円 | 80個 | 120,000円 |
2014/01/25 | さしす工業 | 厚木工場 | なにぬねのセット | 1,500円 | 70個 | 105,000円 |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
コード化後のデータ
日付 | 会社名 | 部署 | 商品 | 単価 | 個数 | 金額 |
---|---|---|---|---|---|---|
2014/01/22 | 1 | 1 | 1 | 2,500円 | 20個 | 50,000円 |
2014/01/22 | 2 | 1 | 1 | 2,500円 | 50個 | 125,000円 |
2014/01/23 | 1 | 2 | 2 | 5,800円 | 30個 | 174,000円 |
2014/01/24 | 3 | 1 | 3 | 1,500円 | 80個 | 120,000円 |
2014/01/25 | 3 | 2 | 3 | 1,500円 | 70個 | 105,000円 |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
・ | ・ | ・ | ・ | ・ | ・ | ・ |
今までの説明で、このコード化したデータについて、既に疑問を持たれている方もいるかと思います。
「コード化したデータの中に単価が入っているのは、おかしい。」
その疑問をもう少し分りやすく書くと、こんな感じではないでしょうか?
「商品の項目には、商品の番号が入っている。商品のマスタには、単価が入っているのだから、このコード化したデータには単価が入っていてはおかしい。省略できるはずだ。それこそ正規化できるはずだ。」
商品名 | 単価 | 番号 |
---|---|---|
まみむめもセット(工業用) | 2,500 | 1 |
わをんパック(大型) | 5,800 | 2 |
なにぬねのセット | 1,500 | 3 |
また、もうひとつ「金額」という項目も不要なのではないかと感じる方もいる事でしょう。「単価」があって「個数」があるのだから「金額」の項目は不要なのではないか。
その答えは、以下です。
もし、来月から「わをんパック(大型)」が安くなり単価が5,000円に変わったら、どうなるでしょう。
マスターデータとして登録されているデータの単価を変更する事になります。
すると既に実績として2014年1月23日に単価5,800円で売上が立っているのに、正規化されているため過去のデータまで単価が5,000円となってしまいます。
また、「金額」に関しても割引や値引きが発生し単価×個数の金額でなくなる可能性もありますね。
当然、値引きが発生したのなら、値引きをした事が分る様な記録をしておく事は必須となります。
この様に正規化しては問題が発生する場合もあります。
つまり、今回の例の単価の様に将来、変わると考えられる項目は、正規化されたコードとしてではなく、実際の値としてデータを保存しておく必要があります。
先程の商品マスタの商品名が将来的に変わる可能性があるならば、コードとしてではなく、商品名を文字としてデータに保管しておいた方が良いかもしれません。
なお、処理としては、マスタデータから単価を取得し、その値を保管すると言う方法になります。
この様に履歴となるデータは、正規化してはいけない場合も存在します。データの正規化を行う場合には、よく検討を重ねて決定する必要があります。
システムが完成した後に過剰な正規化に気が付き修正を行わなければならない場合、膨大な作業が待ち受けているはずですから。