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