ユーザーtbl, 地方tbl, サブ地方tbl の3つのテーブルでユーザーtblの出身地をカテゴライズしたいのですが、すべてのユーザーにサブ地方が存在するわけではありません。
例を挙げれば、地方tblを、関東, 関西などのレコードを持ち、サブ地方tblには、東京, 大阪などのレコードがあると仮定します。
しかし、すべてのユーザーが東京や大阪に属するわけではありません、千葉の方は関東には属しますが東京には属しません。
つまりサブカテゴリを持ちません。
このような場合、後に柔軟なジョイントに対応させるにはどのようにIDを持たせどのような設計が必要でしょうか?
よろしくお願いします。
ユーザーテーブルの出身地に
地方ID、サブ地方IDを持つだけではだめなんでしょうか?
サブ地方IDはない場合もあるので、NULLを許可するか、00:該当なしなどのそれ用のコードを
割り当ててはどうでしょうか?
質問文だけではこれでよいのかよくわかりませんが
サブカテゴリがない場合の扱いを決めればよいだけだと思うのですがどうでしょうか?
サブカテゴリーがない状態が扱いにくいのなら、ダミーのサブカテゴリーを割り当ててしまえば
よいと思います。
|*コード|*氏名|*性別|
|001|一郎|男|
|002|花子|女|
a-kuma3 さんのおっしゃるようにテーブルを再帰的に使うという手法も便利ですが、再帰的利用は以下のような場合に行います
|*社員コード|*名|*上司コード|
|001|一郎||
|002|花子|001|
|003|三郎|002|
|004|四郎|002|
1つのフィールドに2つの異なる情報(地方名と都道府県名)が入るというやりかたは正規化以前にテーブル設計の基礎部分でおかしいですし、ちいさなテーブルとはいっても再帰的な問い合わせを実装していないMySQLでの利用コストは利用頻度に応じて問題になってくるかもしれません
他の方で、非正規化という言葉にのみ反応している人もおられますが、正規化をすでに行ってきておられる現状において、「この部分はここから先、正規化を進めて良いのかどうか?」という質問であるという点には気づいていないのだと思います
もちろん、私の回答は完全解答ではありません。あくまでも提案ベースです
(そちらの組もうとしておられるシステムを俯瞰できるような情報があればロジック側との調整なども含めて)まだまだ別の方法が出てくることでしょう
もっとも、イルカ賞取得率を自慢にしている回答者もいるらしいが。
のではなくて、地方と都道府県(質問では、地方とサブ地方)を異なる情報ととらえることはないんじゃない?、というのが僕の回答。
異なる情報ととらえるべきかどうかは、問題のカテゴリーによってどちらが正しいということは無いのだろうけど、
質問では「後に柔軟なジョイントに対応させるには~」とあるので、そういう場合(先にどうなるか分からない)には、
抽象的に設計しておく方がベターだろう、というのが僕の考え。
「柔軟に」というので、想像したのは以下のようなパターン。
・北海道の支庁
・瀬戸内地方
・越後とか甲府とか、昔っぽい呼び方
こういうのを思いついてしまった時点で、地方ID のフィールドを二つだけ持つような設計は、
僕としてはあり得ない。
今回のケースが十分この範囲に入ると思って回答しました。
コードを付けて管理したいという場合は、テーブルを分けて正規化されたほうが良いと
私は思います。
多くの人が正規化したデータベースを見るのになれてますというのもメリットの一つです。
正規化はわかりやすくするための方法ではありません。
不具合を作りこんだり不整合を起こすようなデータを作らないための手法です。
失礼しました。
回答を延長したつもりでしたが、再開ボタンを押さないといけなかったんですね。
皆様の回答のおかげで、いろんな考え方を頂きだいぶ頭が柔らかくなりましたしだんだんと構想が固まってきました。
ありがとうございました。