SQLではデータの型とその制約を定義するために様々な機能が提供されています。その一つが「DOMAIN(ドメイン/定義域)」です。
DOMAINとは一言で言えば、ユーザーが定義した特別なデータ型のことです。基本的なデータ型に制約を組み合わせることで、特定の目的や要件に適した独自のデータ型を作成することができます。
参考 データ型とは?
例えば、商品の価格を表すデータ型を定義するとしましょう。基本的には数値型ですが、価格はマイナスになることはありません。このような状況でDOMAINを活用することで、価格を表すデータが常に0以上となるような項目を作成することが可能になります。
この記事では、DOMAINの基本的な概念から、具体的な使用方法、さらには実際のデータベース設計におけるDOMAINの活用までを詳しく解説していきます。
プログラマーやシステムエンジニアを目指す方であれば知らないと恥ずかしい基本知識です。是非最後までご覧ください。
SQL/DB 「DOMAIN」とは?
SQLにおけるDOMAINは、ユーザーが定義したデータ型のことを指します。
正の整数型、とか、{有:無} の2つの値だけを許可するデータ型が欲しいような場面でDOMAINが使えるということ。
これは基本的なデータ型と一緒にその値が満たすべき制約を組み合わせたもので、より特定の目的に適したデータ型を作成することができます。
例えば、年齢を表すデータ型を定義する場合、基本的には整数型を利用します。
しかし、人の年齢は通常、0以上の整数であり負の値を取ることはありません。また極端な大きな値(例えば1000歳以上)も現実的ではありません。
このような制約を組み込んだ新しいデータ型を定義することで、データの整合性を確保し、間違ったデータが入力されるのを防ぐことが可能になります。これがDOMAINの重要性です。
また、同じ制約を持つカラムを複数のテーブルで使用する場合にも、DOMAINは大変便利です。例えば、電話番号や郵便番号などの特定の形式を必要とするデータ型をDOMAINとして定義しておくと、それぞれのテーブルで一貫した制約を維持することが容易になります。これにより、データベース全体の整合性と管理の効率性が向上します。
以上のように、DOMAINはデータの型とその制約を一緒に定義することで、データの整合性を保つ上で非常に重要な役割を果たします。次の章では、DOMAINの作成、変更、削除について具体的に解説していきます。
ドメインの作成:CREATE DOMAIN
新しいDOMAINを作成するには、CREATE DOMAIN文を使用します。
/* 新しいDOMAINの作成 */ CREATE DOMAIN domain_name AS data_type CONSTRAINT constraint_name CHECK (value_condition);
例えば、前述の年齢を表すデータ型をDOMAINとして定義する場合、次のようになります。
/* 年齢を表すDOMAINの作成 */ CREATE DOMAIN age AS INTEGER CONSTRAINT valid_age CHECK (VALUE >= 0 AND VALUE <= 130);
↑ではDOMAIN age
を作成しています。このage
は整数型で、値は0以上130以下であるという制約を持っています。このように定義しておくことで、0未満や131以上の値がage
に設定されるのを防ぐことができます。
ドメインの変更:ALTER DOMAIN
既存のDOMAINを変更するには、ALTER DOMAIN文を使用します。基本的な構文は次のとおりです。
/* 既存のDOMAINの制約の追加 */ ALTER DOMAIN domain_name ADD CONSTRAINT constraint_name CHECK (value_condition);
例えば、先ほど作成した年齢を表すDOMAINに、さらに値が120以上はありえないという制約を追加したいとします。その場合、次のように記述します。
/* 年齢を表すDOMAINに制約の追加 */ ALTER DOMAIN age ADD CONSTRAINT valid_age_upper_limit CHECK (VALUE <= 120);
↑では、すでに存在するDOMAIN age
に対して、新たに制約valid_age_upper_limit
を追加しています。この制約により、age
の値が120を超えることはなくなります。
ドメインの削除:DROP DOMAIN
DOMAINを削除するには、DROP DOMAIN文を使用します。
/* 既存のDOMAINの削除 */ DROP DOMAIN domain_name;
例えば、先ほど作成した年齢を表すDOMAINが不要になったとします。その場合、次のように記述します。
/* 年齢を表すDOMAINの削除 */ DROP DOMAIN age;
この例では、DOMAIN age
を削除しています。
ただし、注意点として、すでに他のテーブルで使用されているDOMAINを削除することはできません。そのような場合には、まずDOMAINを使用しているカラムやテーブルを削除するか、別のデータ型に変更してから、DOMAINを削除します。
ドメインの活用例
これまでに、DOMAINの作成、変更、削除方法について詳しく見てきました
。この章では、これらの知識を活かして、実際のデータベース設計におけるDOMAINの活用方法についていくつかサンプルをご紹介します。
サンプル1 電話番号(日本の場合)
電話番号は通常特定の形式を持っています。以下の例では、日本の標準的な電話番号形式(3桁-4桁-4桁)を定義しています。
/* 電話番号を表すDOMAINの作成 */ CREATE DOMAIN phone_number AS VARCHAR(13) CONSTRAINT valid_phone_number CHECK (VALUE ~ '^[0-9]{3}-[0-9]{4}-[0-9]{4}$');
サンプル2 郵便番号
郵便番号も特定の形式を持っています。以下の例では、日本の標準的な郵便番号形式(3桁-4桁)を定義しています。
/* 郵便番号を表すDOMAINの作成 */ CREATE DOMAIN postal_code AS VARCHAR(8) CONSTRAINT valid_postal_code CHECK (VALUE ~ '^[0-9]{3}-[0-9]{4}$');
サンプル3 メールアドレス
以下の例では、基本的なメールアドレスの形式を定義しています。
/* メールアドレスを表すDOMAINの作成 */ CREATE DOMAIN email AS VARCHAR(255) CONSTRAINT valid_email CHECK (VALUE ~ '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$');
これらの例では、各々のドメインが特定の形式の文字列データを保証するために使用されています。データベース設計時にこれらのドメインを適切に使用することで、データの整合性を保つことができます。
【まとめ】ドメインとは何か
SQLやデータベースの仕組みを1から学習したい方(学び直したい方)向けに、現役エンジニア達のスキルを結集して 完全無料 のSQL教材を作成しました。
SQLは決して難しい技術ではないので、エンジニアであれば「当たり前のように」扱えて当然かも・・・?
とはいえ、案外SQLをちゃんと使ったことがない人も多いはずです。この機会に是非一度ご覧になってみてください。