具象テーブル継承
基底クラスSと、それを継承したAとBがある時に、これらをどうtableで表現するか
AとBを個別にtableを作り、全てのcolumnを持たせる
例
こういう構造がある時に
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:A
name age status version
hoge 20 XXX 2
table:B
name age priority
piyo 20 high
個別に正しい実装をできる
NULLなどの制約を設けられる
tableの定義を見れば、どの値が必須項目なのかわかる
「これはAです」「これはBです」のようなtypeを表すcolumnが不要
共通属性のみを選択し、UNIONしたViewを定義しておくと便利
短所
AとBを個別で見た時に、どれが共通の属性なのか判別するのが難しい
上記例で言えば、nameとageが共通している
これらの共通している項目が、たまたま共通しているだけなのか、意図したものなのかの判断ができない
tableをまたいで共通の属性に対するユニーク制約がかけられない
共通の項目に変更があった場合に修正が面倒そう
AもBもCも...、columnを増やす必要がある
これはこれで共通項目の集計がダルそう
集計前に、A,B,C,..を全てJOINしたtableに対して、集計する必要がある
参考