シングルテーブル継承
table設計のパターン
基底クラスSと、それを継承したAとBがある時に、これらをどうtableで表現するか
シングルテーブル継承は、AとBの属性を全部1まとめにした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 status version priority
hoge 20 XXX 2 NULL
piyo 20 NULL NULL high
汎用的なS tableを作りました、ってだけ
modelingの結果として雑すぎて良くないと思うmrsekut.icon
継承した物の数が増えるとcolumnが増え続ける
上記の例で言えば、C, D, ...がある時
不要なcolumnにはNULLが入りまくる
同じ理由でNOT NULL制約をかけられない
「このタイプは、この項目を埋める」というのがtableの定義から自明でない
上記の例で言えば、「Atypeの場合は、(name,age,status)が必須」というのがわからない
EntityとTableが1対1対応してしまうframworkを使うと起きがちが印象がある
参考
EAVの解決策の一つとして提示されているが良くないと思うmrsekut.icon