generated at
クラステーブル継承
table設計のパターン

基底クラス S と、それを継承した A B がある時に、これらをどうtableで表現するか
S A B を個別にtableを作る


こういう構造がある時に
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; }
こうする
S
nameagea_idb_id
hoge201NULL
piyo 20NULL1
A
idstatusversion
1XXX2
B
idpriority
1high
ここで、 a_id b_id が外部キー制約を設ける


個別に正しい実装をできる
NOT NULLなどの制約を設けられる
tableの定義を見れば、どの値が必須項目なのかわかる
「これは A です」「これは B です」のようなtypeを表すcolumnが不要
どれが共通の項目なのかわかりやすい

このテーブルには、UNIQUE制約や、CHECK制約もつけられるかも


短所
a_id b_id のいずれか片方は必ずNULLになる
ただし、それは制約で縛れない
故に、両方がNULLなレコードも入りうる
C D などの新たなパターンが出てきた時に、columnが増え続ける
既存のデータに対してはNULLを入れれば良いだけなのでまだまし
NULLが増えまくるのがキモいぐらいか





参考