具象テーブル継承
基底クラス S
と、それを継承した A
と B
がある時に、これらをどうtableで表現するか
A
と B
を個別にtableを作り、全てのcolumnを持たせる
例
こういう構造がある時に
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;
}
こうする
Aname | age | status | version |
hoge | 20 | XXX | 2 |
Bname | 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に対して、集計する必要がある
参考