質問: 複数テーブルに同一の外部キーやカラムがある場合 例えば、ホテルテーブル、レストランテーブル、映画館テーブルなど施設別のテーブルが多数あり、 そのそれぞれが、所在エリアを示すエリアidを持つ場合、テーブル1つずつにエリアidを外部キーとして持たせるか、施設テーブルという抽象的なテーブルを作り、そこにエリアidを持たせ、具体的なホテルテーブルなどは施設テーブルと1対1で結びつけるべきか、迷っていますが、どちらがいいでしょうか? エリアid以外にも共通のカラムがあります(名称、住所など)。 今後、具体的な施設テーブルは増える可能性があります(遊園地テーブルなど)。 また、エリアid以外にも共通の外部キーも増える可能性があります(所有会社idなど)。 そう考えるとテーブル1つずつにリレーションを付けるとer図が線だらけになる気がします。 しかし抽象テーブルを作ると、データを取ってくるたびに毎回joinしないといけないのが気になります。 ご意見お願いします。
回答: データの「持たせ方」で決めましょう。 例えば、施設1つ1つに固有な「ユニークid」を持っている場合「idの1~2桁目を施設idと同一に、3~5桁目をエリアidと同一にしておく」と言う持ち方をした場合は、以下のようにした方が楽です。 種別テーブル 01:ホテル 02:レストラン 03:映画館 エリアテーブル 001:ベイエリア 002:駅前 003:タウンパーク 施設テーブル 010010001:ベイエリアホテル 010020001:駅前ホテル第一 010020002:駅前ホテル第二 010020003:駅前ホテル第二別館 010030001:ホテルタウンパーク 020010001:ベイエリアホテル1fラウンジ「カトエラ」 020010002:ベイエリアホテル15fバー「bay night」 020010003:ベイエリアホテル2f和食處「祇園」 030020001:駅ビルシネマタウン 030030001:シネマタウン・タウンパーク館 ユニークidを切り出せば、種別やエリアを別テーブルから参照できます。 ユニークidから各コードを切り出すのが面倒なら、以下のように、ユニークidの代わりに「種別コード」「エリアコード」「id番号」の3つを持たせれば良いです。 施設テーブル 01:001:0001:ベイエリアホテル 01:002:0001:駅前ホテル第一 01:002:0002:駅前ホテル第二 01:002:0003:駅前ホテル第二別館 01:003:0001:ホテルタウンパーク 02:001:0001:ベイエリアホテル1fラウンジ「カトエラ」 02:001:0002:ベイエリアホテル15fバー「bay night」 02:001:0003:ベイエリアホテル2f和食處「祇園」 03:002:0001:駅ビルシネマタウン 03:003:0001:シネマタウン・タウンパーク館 ここで注目して欲しいのは、施設テーブルが、ホテルもレストランも映画館も、すべて1つのテーブルに入っている、と言う事です。 こうする事で、「名称」や「住所」など、全施設に共通な項目は、このテーブル1つで済む、と言う事と、施設の種類やエリアが増えても、テーブルそのものを増やさなくて良い、と言う事。 で「厨房責任者」や「映写技師」など「レストランのみに要る項目」や「映画館のみに要る項目」は「レストラン付随テーブル」や「映画館付随テーブル」として別テーブルにしておき、固有idやコードでjoinして呼び出します。 レストラン付随テーブル(支配人、厨房責任者、衛生管理責任者) 02:001:0001:小泉純一郎:安倍晋三:福田康夫 02:001:0002:麻生太郎:鳩山由紀夫:菅直人 02:001:0003:橋本龍太郎:小渕恵三:森喜朗 映画館付随テーブル(館長、映写技師) 03:002:0001:田中角榮:竹下登 03:003:0001:佐藤榮作:小沢一郎 データベースを設計する上で、最も重要な事は「何かが増えても、テーブルそのものを増やさなくても良いように設計する」と言う事。 後から遊園地が増えても、遊園地テーブルを増やすような事はせず(遊園地固有のデータを入れておく「遊園地付随テーブル」だけは、増やして構わないが)、種別テーブルの中に遊園地レコードを追加する、施設テーブルに遊園地データを追加する、など「レコードを追加するだけで、どんどん新規の種別、新規のエリア、新規の施設が増やせるようにするのです。 以下蛇足なクイズ:サンプルデータの氏名の中で、仲間ハズレは誰でしょう?