ENUM型
固定値のリストを表すSQLの型。CREATE TYPE status AS ENUM ('active','pending','closed')のように定義し、型安全で、保存も効率的(文字列ではなく4バイトのOIDで格納)。
PostgreSQLでは定義した順序が保たれ、ソートもその順になる。MySQLのENUMはずっと古く、挙動が少し異なる。代償として、値を変更するにはALTER TYPEが必要で、大きなテーブルでは高くつくことがある。そのため経験を積んだ開発者の多くは、VARCHARにCHECK制約を組み合わせる方を好む。柔軟で、マイグレーションの苦労も少ないからだ。典型的な落とし穴は、最初は「draft」だけだったのに後から「scheduled」を足したくなり、本番DBに対するALTERが必要になるケース。より柔軟な代替案は、外部キーで参照するルックアップテーブルである。