データベースを学んでいると「スキーマ」という言葉に何度も出会います。
しかし「スキーマって結局何のこと?」「テーブルとどう違うの?」と疑問に思う方も多いでしょう。
データベースにおけるスキーマとは、データの構造・定義・制約を記述した設計図のようなものです。
スキーマを正しく理解することは、DB設計・SQL操作・システム開発の質を大きく左右します。
本記事では、データベースにおけるスキーマの意味・役割・種類・テーブルとの関係・実際のSQL例をわかりやすく解説していきます。
データベースにおけるスキーマとは何か?基本的な意味と役割
それではまず、データベースにおけるスキーマの基本的な意味と役割について解説していきます。
データベースにおけるスキーマ(Schema)とは、データベース内のデータ構造・テーブル・列・データ型・制約・関係性などを定義した設計情報の集合のことです。
スキーマは「データベースの設計図」や「データ構造の青写真」とも表現されます。
人間で例えるなら、スキーマは「組織図」のようなものです。
どの部署があり、各部署にどのような役職があり、誰がどの役職に就いているかを定義するのが組織図であるように、スキーマはデータベースにどのようなテーブルがあり、各テーブルにどのような列があり、どのような制約が適用されるかを定義します。
スキーマの三つの意味
「スキーマ」という言葉はデータベースの文脈で三つの異なる意味で使われることがあります。
意味1:データベース全体の構造定義(広義のスキーマ)
テーブル・ビュー・インデックス・制約・ストアドプロシージャなど、データベースオブジェクトの総体としての定義
意味2:名前空間としてのスキーマ
PostgreSQLやSQL Serverで使われる、データベースオブジェクトをグループ化する名前空間の単位
意味3:テーブルの列定義(狭義のスキーマ)
特定のテーブルにおける列名・データ型・制約の定義(MySQLではSHOW CREATE TABLEで確認できる)
文脈によってどの意味で使われているかが変わるため、注意が必要です。
スキーマの主な役割
データベーススキーマの役割は大きく四つに分けることができます。
一つ目は「データ構造の定義」で、テーブル・列・データ型・制約などを明確に定義することでデータの形式を統一します。
二つ目は「データ整合性の担保」で、主キー・外部キー・NOT NULL・UNIQUE制約などにより、不正なデータの格納を防ぎます。
三つ目は「アクセス制御の基準」で、スキーマ単位でユーザーの権限を管理できます。
四つ目は「論理的なデータ整理」で、業務領域ごとにオブジェクトをグループ化し、データベース全体の見通しを良くします。
スキーマと物理設計・論理設計の関係
データベース設計は一般的に「概念設計→論理設計→物理設計」の三段階で行われます。
スキーマは主に論理設計・物理設計の段階で具体的な形を持ちます。
論理スキーマはテーブル・列・関係性などをDBMSに依存しない形で定義したもので、物理スキーマは特定のDBMS上での実際のテーブル・インデックス・ストレージ設定などを含む実装レベルの定義です。
スキーマとテーブルの関係をわかりやすく解説
続いては、スキーマとテーブルの関係についてわかりやすく解説していきます。
スキーマとテーブルの関係は「フォルダとファイル」に例えることができます。
スキーマがフォルダ(名前空間)であり、テーブルがそのフォルダ内に格納されるファイル(データオブジェクト)という関係です。
スキーマ内に格納されるオブジェクトの種類
スキーマには、テーブル以外にも様々なデータベースオブジェクトが含まれます。
| オブジェクトの種類 | 説明 |
|---|---|
| テーブル | 行と列で構成されるデータの集合 |
| ビュー | クエリの結果を仮想テーブルとして扱うもの |
| インデックス | 検索を高速化するためのデータ構造 |
| ストアドプロシージャ | DB内に保存された手続き型プログラム |
| トリガー | 特定のイベントに自動実行される処理 |
| シーケンス | 連続した数値を生成するオブジェクト |
SQLでスキーマを確認する方法
各DBMSでスキーマ情報を確認するSQLは異なります。
PostgreSQLでスキーマ一覧を確認する
SELECT schema_name FROM information_schema.schemata;
MySQLでテーブルの構造(スキーマ)を確認する
DESCRIBE テーブル名;
または SHOW CREATE TABLE テーブル名;
SQL Serverでスキーマ一覧を確認する
SELECT name FROM sys.schemas;
information_schemaはSQLの標準仕様として多くのDBMSでサポートされており、テーブル・列・制約などのスキーマ情報をSQLで参照できます。
スキーマ設計のベストプラクティス
続いては、スキーマ設計のベストプラクティスについて確認していきます。
良いスキーマ設計はシステムのパフォーマンス・保守性・拡張性に大きく影響します。
正規化とスキーマ設計
リレーショナルデータベースのスキーマ設計において「正規化」は非常に重要な概念です。
正規化とは、データの冗長性を排除し整合性を保つためにテーブルを適切に分割する設計手法です。
第1正規形(1NF)・第2正規形(2NF)・第3正規形(3NF)という段階があり、一般的には第3正規形まで適用することが推奨されます。
ただし、パフォーマンスのために意図的に非正規化(denormalization)を行うケースもあります。
制約の適切な設定
スキーマ設計において、制約(constraint)の適切な設定はデータ整合性を守る上で欠かせません。
スキーマ設計で設定すべき主な制約の種類
PRIMARY KEY(主キー):テーブル内で各レコードを一意に識別する列に設定する
FOREIGN KEY(外部キー):テーブル間の参照整合性を保つために設定する
NOT NULL:NULLを許可しない列に設定し、必須項目を保証する
UNIQUE:列の値の一意性を保証する(メールアドレスなど)
CHECK:列の値が特定の条件を満たすことを保証する
DEFAULT:値が指定されない場合のデフォルト値を設定する
まとめ
本記事では、データベースにおけるスキーマの意味・役割・テーブルとの関係・SQL での確認方法・設計のベストプラクティスについて解説してきました。
スキーマはデータベースの設計図として、データ構造の定義・整合性の担保・アクセス制御・論理的整理という四つの役割を果たします。
スキーマを正確に理解し、正規化・適切な制約設定・命名規則の統一などのベストプラクティスを意識した設計を行うことで、保守性・拡張性・パフォーマンスに優れたデータベースシステムの構築が実現できるでしょう。