第3章/全8章 ・ 目安 5分

表を分ける理由

同じことを何度も書かない工夫

1枚の表にまとめると、何が困るのか

表計算ソフトで請求の一覧を作ると、次のように取引先の名前や地域を毎行に書きがちです。

請求番号取引先名地域金額
INV-101北山商事福岡120,000
INV-102南浜工業大阪85,000
INV-103北山商事(株)福岡43,000
INV-106南浜工業大坂150,000
よくない例:同じ取引先の情報を、請求のたびに書いている。赤字は表記ゆれと入力ミス。

この形には、3つの困りごとがあります。

  1. 表記ゆれ:「北山商事」と「北山商事(株)」が別の会社として集計される
  2. 直し漏れ:北山商事が移転したら、全部の行を探して直す必要があり、1行でも漏れると食い違う
  3. むだ:同じ情報を何千回も書くので、量が増え、入力の手間も増える

表を分けて、番号でつなぐ

そこでデータベースでは、取引先の情報は取引先のテーブルに1回だけ書き、請求書のテーブルには 取引先ID だけを書きます。

請求書テーブルの customer_id が、取引先テーブルの id を指している図customers(取引先)id 主キーname 取引先名region 地域1社につき1行だけinvoices(請求書)invoice_no 主キーcustomer_id 外部キーissued_on 請求日amount 金額status 状態取引先IDで指す1多
請求書は「どの取引先か」を番号で指すだけ。名前や地域は取引先のテーブルを見に行く。

こうすると、北山商事が移転しても、直すのは取引先テーブルの1行だけです。請求書は番号で指しているので、何も直さなくても新しい住所につながります。

請求書の customer_id のように、ほかのテーブルの主キーを指す列を 外部キー と呼びます。外部キーを設定しておくと、データベースは「存在しない取引先IDの請求書」を登録させません。これも、表計算ソフトでは防ぎにくいミスです。

1対多と、多対多

1つの取引先には、たくさんの請求書があります。このつながり方を 1対多 と呼びます。図の「1」と「多」がそれを表しています。

では「請求書」と「商品」はどうでしょう。1枚の請求書に複数の商品が載り、1つの商品は多くの請求書に載ります。これは 多対多 です。このときは間に「請求明細」のテーブルを置き、「どの請求書の、どの商品を、いくつ」を1行ずつ記録します。請求書の明細行そのものなので、経理の感覚でも自然な形です。

この整理の仕方を「正規化」と呼ぶ

同じ情報を1か所にだけ置くように表を分けることを 正規化 と呼びます。正規化すると、データの食い違いが起きにくくなります。

ただし、分けすぎると、取り出すときに多くの表をつなぐ必要があり、読む側が大変になります。そのため、売上分析のように「読むこと」が中心の用途では、あえて表をまとめた形を別に用意することもあります。どこまで分けるかは、設計者の判断です。

この章のポイント
  • 同じ情報を何度も書くと、表記ゆれ・直し漏れ・むだが起きる
  • 情報は1か所にだけ置き、ほかの表からは番号(外部キー)で指す
  • この整理の仕方が正規化。分けすぎると読むのが大変になる