ある選択肢のみ許容するcolumnを定義する際の方針
table設計時に、columnが、ある選択肢のみ許容するように設計したい時にどうするか
いわゆるサーティワンフレーバーと呼ばれるパターン
いくつかの方針が考えられる
ENUM型 (DB)
e.g. ENUM('A', 'B', 'C')
CHECK制約
e.g. VARCHAR (20) CHECK (status IN ('A', 'B', 'C'))
ユーザー定義型
DBトリガーを記述する
より緩い型
e.g. string
これは、まあ言うまでもなく論外だろうmrsekut.icon
他のtable + 外部キー制約
結論
将来的に、選択肢に変更の可能性が少しでもある場合
他のtable + 外部キー制約
本当に将来的に変更がないと確信できる場合
CHECK制約
ENUM型 (非標準)
それ以外はなし
ユーザー定義型、DBトリガー
DBの移植性が弱い上に、上記2つを超えるメリットがない
↑この方針だけではちょっと緩い気がするmrsekut.icon
これだけだと、47都道府県をENUMで定義する余地がまだ存在する
かなり直感には反するが、一応そこまで問題ないのか
普通は、他のtableに定義すると思うmrsekut.icon
↓viewに一覧するのがダルい問題はある
「他のtable + 外部キー制約」以外の選択肢は、とにかく変更に弱い
選択肢の追加、削除、分解などがあった場合に、とにかく面倒くさい
UIで「許容される選択肢」をセレクトボックスなどで表示する際に、
ENUM型などを使っていると面倒になる
mysqlの場合は、INFORMATION_SCHEMAを見る
ただし、返ってくるのは"ENUM('A','B','C')"のような文字列
これをparseして、['A','B','C']に変換する必要がある
参考
/mrsekut-book-4873115892/150 (10章 サーティワンフレーバー (31 のフレーバー))
丁寧に解説されている
https://www.slideshare.net/tkfuji/sqlap-10-31