こんにちは!データベースの世界へようこそ。
PostgreSQLを触っていると、最初は「とりあえずテキストと数字を入れておけばいいか」となりがちですよね。でも、システムが少し大きくなってくると、「あれ、この列って結局どんなデータが入るんだっけ?」と混乱したり、おかしなデータが紛れ込んで頭を抱えたりすることがよくあります。
今日は、そんな悩みを解決して、データベースを「整理整頓上手」にしてくれる、「カスタム型(DomainとEnum)」という便利な道具についてお話しします。
—
データベースに「ルール」という名前をつけてあげる
例えば、皆さんがネットショップの会員登録フォームを作るとしましょう。「電話番号」を保存する列を作りますよね。普通は`TEXT`型を使います。
でも、`TEXT`だと「090-1234-5678」も入れば、「あいうえお」も入っちゃいます。これじゃあ困りますよね。
そこで登場するのが `CREATE DOMAIN` です。
DOMAIN(ドメイン)は「型に名前とルールをつける」こと
`DOMAIN`は、既存の型に「お約束」をくっつけた新しい名前を作る機能です。例えるなら、「手書きのラベル」を貼るようなイメージです。
— 電話番号専用のルールを作ってみる
CREATE DOMAIN phone_number AS TEXT
CHECK (VALUE ~ ‘^[0-9-]+$’); — 数字とハイフン以外は受け付けない!
こうしておけば、今後はテーブルを作るときに「この列は `phone_number` 型です」と宣言するだけで、勝手に「数字とハイフン以外はエラーにする」というチェックが働きます。
いちいち「この列にチェック制約を書いて…」としなくていいので、コードがスッキリするし、何より「この列は電話番号用なんだ」という意図が他のエンジニアにも伝わりやすくなるんです。これ、すごく大事なことだと思いませんか?
—
選択肢をガチガチに固める「列挙型(ENUM)」
次に紹介したいのが `CREATE TYPE … AS ENUM` です。これは「決まった値しか入れさせない」ための最強のガードマンです。
例えば、「注文状況」を管理する列があったとします。「受付」「発送済み」「キャンセル」の3つ以外はありえない、という状況ですね。
`TEXT`で管理すると、「発送済」と「発送済み」が混ざっちゃったり、「とりあえず未定って入れとこう」という曖昧なデータが入ったりして、後で集計するときに泣くことになります。
ENUM(エナム)は「メニュー表」のようなもの
`ENUM`は、あらかじめ許された値だけを登録しておく「メニュー表」です。
— 注文状態をメニュー化する
CREATE TYPE order_status AS ENUM (‘received’, ‘shipped’, ‘canceled’);
こう定義してしまえば、もし誰かが「waiting」なんていう変なデータを入れようとしても、PostgreSQLが「そんなメニューはありません!」と即座に怒って止めてくれます。
これのおかげで、プログラムのバグを未然に防げるし、何より後からデータを見たときに「この列にはこの状態しかないんだな」と一瞬で理解できます。
—
どっちを使えばいいの?
使い分けはこんな感じです。
- `DOMAIN`: 「電話番号」「メールアドレス」のように、形式(フォーマット)にルールがあるとき。
- `ENUM`: 「注文状態」「性別」「曜日」のように、決まった選択肢しかないとき。
どちらも、データベースを「カチッ」とした信頼できるものにしてくれる、魔法のような機能です。
—
最後に:データベースは「優しいガイド役」
初心者のうちは、データベースに制約をたくさん書くのを「面倒だな」と感じるかもしれません。でも、実はこれこそが「未来の自分」への最大の優しさなんです。
半年後の自分がそのデータベースを見たときに、ルールが明文化されていれば、驚くほどスムーズに作業が再開できます。
ぜひ皆さんも、自分の作っているテーブルに「どんなルールがあるかな?」と問いかけて、`DOMAIN`や`ENUM`で名前をつけてあげてください。きっと、データベースがもっと頼もしいパートナーになってくれるはずですよ。
それでは、また次回の記事でお会いしましょう!Happy Coding!
コメント