1枚の表にまとめると、何が困るのか
表計算ソフトで請求の一覧を作ると、次のように取引先の名前や地域を毎行に書きがちです。
| 請求番号 | 取引先名 | 地域 | 金額 |
|---|---|---|---|
| INV-101 | 北山商事 | 福岡 | 120,000 |
| INV-102 | 南浜工業 | 大阪 | 85,000 |
| INV-103 | 北山商事(株) | 福岡 | 43,000 |
| INV-106 | 南浜工業 | 大坂 | 150,000 |
この形には、3つの困りごとがあります。
- 表記ゆれ:「北山商事」と「北山商事(株)」が別の会社として集計される
- 直し漏れ:北山商事が移転したら、全部の行を探して直す必要があり、1行でも漏れると食い違う
- むだ:同じ情報を何千回も書くので、量が増え、入力の手間も増える
表を分けて、番号でつなぐ
そこでデータベースでは、取引先の情報は取引先のテーブルに1回だけ書き、請求書のテーブルには 取引先ID だけを書きます。
こうすると、北山商事が移転しても、直すのは取引先テーブルの1行だけです。請求書は番号で指しているので、何も直さなくても新しい住所につながります。
請求書の customer_id のように、ほかのテーブルの主キーを指す列を 外部キー と呼びます。外部キーを設定しておくと、データベースは「存在しない取引先IDの請求書」を登録させません。これも、表計算ソフトでは防ぎにくいミスです。
1対多と、多対多
1つの取引先には、たくさんの請求書があります。このつながり方を 1対多 と呼びます。図の「1」と「多」がそれを表しています。
では「請求書」と「商品」はどうでしょう。1枚の請求書に複数の商品が載り、1つの商品は多くの請求書に載ります。これは 多対多 です。このときは間に「請求明細」のテーブルを置き、「どの請求書の、どの商品を、いくつ」を1行ずつ記録します。請求書の明細行そのものなので、経理の感覚でも自然な形です。
この整理の仕方を「正規化」と呼ぶ
同じ情報を1か所にだけ置くように表を分けることを 正規化 と呼びます。正規化すると、データの食い違いが起きにくくなります。
ただし、分けすぎると、取り出すときに多くの表をつなぐ必要があり、読む側が大変になります。そのため、売上分析のように「読むこと」が中心の用途では、あえて表をまとめた形を別に用意することもあります。どこまで分けるかは、設計者の判断です。
この章のポイント
- 同じ情報を何度も書くと、表記ゆれ・直し漏れ・むだが起きる
- 情報は1か所にだけ置き、ほかの表からは番号(外部キー)で指す
- この整理の仕方が正規化。分けすぎると読むのが大変になる