実現したいこと
あるテーブルの内容について,その部分集合が異なるテーブルに紐づく場合のリレーションの扱いについて知りたいです.
例えば,以下の様な人テーブルが存在し,
id | 姓 | 名 |
---|---|---|
1 | 山田 | 太郎 |
2 | 田中 | 次郎 |
この内,id が 1
の人(山田さん)のみが学生であるとします.
次に,以下のような学生テーブルを作成し,この内の id 18
の要素が 山田
さんの情報を示しているとします.
|id|person_id|大学|専攻|
|:--|:--:|--:|
|...|...|...|...|
|18|1|A大学|情報|
|...|...|...|...|
このように,あるテーブルにおける部分集合(人のテーブルでは田中さんは学生ではないので,学生テーブルと紐付ける必要はない)に対して,追加で情報を紐付ける場合は,どう設計するのがうまくいくのでしょうか?
ご教授お願い致します.
テーブルの一部のレコードに情報を紐づけ(追加)する方法は2つです。 1)テーブルにフィールドを追加して、そこに記載する。例えば、"専攻"の次に"年生"のフィールドを追加して、何年生なのかが判るようにする。 2)他のテーブルと紐づけるキー(ForeignKey)のフィールドを追加して、他のテーブルの情報(例えば、性別)を追加する。 このように考えると、主キー(Primarykey)と姓、名の3フィールドから成る人テーブルは使い勝手が悪そうです。
@coco_bauer
回答ありがとうございます.
1) の方法では "人テーブル" で考えた際に,すべての人は学生ではないため学生ではない人の対しては null になってしまいます.この場合 "人テーブル" の中身がスパースになってしまい,あまり設計としてよろしくないような気がします.
別の視点としてオブジェクト指向で置き換えると,例えば学生クラスと先生クラスがあり,これらは上位クラスである人クラスの継承であるとします.この各クラスをテーブルとして見立てるとします.
というのも要件として,人クラスの粗い粒度で使いたい場合と,学生クラスや先生クラスなどやや小さい粒度で扱いたい場合の複数の場合が想定されるためです.
なので,2)の方法がかなり想定として近いのですが,ただこの場合2つのテーブルの関係性はどうなるのかが不明で質問した次第です.
現在進行系で検討した結果,先生テーブルと学生テーブルの粒度でのみテーブルを持っており,人クラスは廃止するほうがベターなのかなぁという気はしています.
が,デファクトでどうのような設計が使われているのかは気になっています.
回答1件
あなたの回答
tips
プレビュー