クラステーブル継承
table設計のパターン
基底クラスSと、それを継承したAとBがある時に、これらをどうtableで表現するか
S、A、Bを個別にtableを作る
例
こういう構造がある時に
code:ts
type S = A | B
type A = {
name: string; // この2つはBと共通
age: number; // この2つはBと共通
status: Status;
version: Version
}
type B = {
name: string; // この2つはAと共通
age: number; // この2つはAと共通
priority: Priority;
}
こうする
table:S
name age a_id b_id
hoge 20 1 NULL
piyo 20 NULL 1
table:A
id status version
1 XXX 2
table:B
id priority
1 high
ここで、a_idやb_idが外部キー制約を設ける
個別に正しい実装をできる
NOT NULLなどの制約を設けられる
tableの定義を見れば、どの値が必須項目なのかわかる
「これはAです」「これはBです」のようなtypeを表すcolumnが不要
どれが共通の項目なのかわかりやすい
このテーブルには、UNIQUE制約や、CHECK制約もつけられるかも
短所
a_idかb_idのいずれか片方は必ずNULLになる
ただし、それは制約で縛れない
故に、両方がNULLなレコードも入りうる
C、Dなどの新たなパターンが出てきた時に、columnが増え続ける
既存のデータに対してはNULLを入れれば良いだけなのでまだまし
NULLが増えまくるのがキモいぐらいか
参考