generated at
ある選択肢のみ許容するcolumnを定義する際の方針

table設計時に、columnが、ある選択肢のみ許容するように設計したい時にどうするか
いわゆるサーティワンフレーバーと呼ばれるパターン


いくつかの方針が考えられる
e.g. ENUM('A', 'B', 'C')
e.g. VARCHAR (20) CHECK (status IN ('A', 'B', 'C'))
ユーザー定義型
DBトリガーを記述する
より緩い型
e.g. string
これは、まあ言うまでもなく論外だろうmrsekut
他のtable + 外部キー制約



結論
将来的に、選択肢に変更の可能性が少しでもある場合
他のtable + 外部キー制約
本当に将来的に変更がないと確信できる場合
CHECK制約
ENUM型 (非標準)
それ以外はなし
ユーザー定義型、DBトリガー
DBの移植性が弱い上に、上記2つを超えるメリットがない


↑この方針だけではちょっと緩い気がするmrsekut
これだけだと、47都道府県をENUMで定義する余地がまだ存在する
かなり直感には反するが、一応そこまで問題ないのか
普通は、他のtableに定義すると思うmrsekut
↓viewに一覧するのがダルい問題はある


「他のtable + 外部キー制約」以外の選択肢は、とにかく変更に弱い
選択肢の追加、削除、分解などがあった場合に、とにかく面倒くさい
UIで「許容される選択肢」をセレクトボックスなどで表示する際に、
ENUM型などを使っていると面倒になる
mysqlの場合は、INFORMATION_SCHEMAを見る
ただし、返ってくるのは "ENUM('A','B','C')" のような文字列
これをparseして、 ['A','B','C'] に変換する必要がある



参考
丁寧に解説されている