スキーマ すきーま
簡単に言うとこんな感じ!
スキーマは「データベースの設計図」だよ!「顧客テーブルには名前・メールアドレス・電話番号を入れる」「年齢は数字だけOK」みたいなルールをまとめたものなんだ。建物でいう間取り図みたいなイメージで、実際のデータを入れる前に「どんな形でデータを管理するか」を決めておく仕組みってこと!
スキーマとは
スキーマ(Schema)とは、データベースの構造・構成を定義した「設計図」のことです。どんなテーブル(表)があり、各テーブルにどんな列(カラム)があり、それぞれの列にどんなデータ型(文字列・数値・日付など)が入るか、といったルールをまとめたものです。ギリシャ語で「形・図式」を意味する言葉が語源で、データの「型」を定義するという意味合いがそのまま使われています。
スキーマはいわばデータの入れ物の仕様書です。たとえばExcelで言うと、「A列に名前、B列に金額(数値のみ)、C列に日付」という列の設定をファイル全体に適用したようなイメージです。実際のデータ(行)を入れる前に、この設計図を先に作っておくことで、誤ったデータの混入を防いだり、複数のシステムがデータを正しく読み書きできるようになります。
システム開発の現場では、スキーマを先に設計することをスキーマ設計またはデータモデリングと呼び、プロジェクトの初期段階で行う重要な作業です。スキーマが曖昧なままシステムを作り始めると、後で「この項目を追加したい」「この列の型を変えたい」という変更が難しくなるため、発注側も概念を理解しておくことが重要です。
スキーマの構成要素
スキーマを構成する主な要素は以下のとおりです。
| 要素 | 説明 | 例 |
|---|---|---|
| テーブル(Table) | データを格納する表の単位 | customers(顧客)、orders(注文) |
| カラム(Column) | テーブルの列。各データ項目を表す | name(名前)、email(メール) |
| データ型(Data Type) | 各カラムに入れられる値の種類 | VARCHAR(文字列)、INT(整数)、DATE(日付) |
| 制約(Constraint) | データに課すルール | NOT NULL(空不可)、UNIQUE(重複不可) |
| 主キー(Primary Key) | 各行を一意に識別するカラム | customer_id |
| 外部キー(Foreign Key) | 他テーブルとの関連を示すカラム | order.customer_id → customers.customer_id |
| インデックス(Index) | 検索を高速にするための索引 | email カラムにインデックスを設定 |
実際のスキーマ定義(DDL)の例
データベースにスキーマを登録するSQL文をDDL(Data Definition Language:データ定義言語)と呼びます。
-- 顧客テーブルの定義(スキーマ)
CREATE TABLE customers (
customer_id INT NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE,
birthdate DATE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
この CREATE TABLE 文がスキーマそのものです。実際のデータ(山田太郎、taro@example.com…)はまだここには存在しません。
「スキーマ」が指す範囲は文脈で変わる
「スキーマ」という言葉は使われる文脈によって指す範囲が異なります。
【広い意味】
データベース全体の構造定義
↓
【中程度の意味】
特定のデータベース内のテーブル群のまとまり
(PostgreSQLでは名前空間として使われる)
↓
【狭い意味】
個々のテーブル1つの列定義
発注・会話の場面では「データの設計図全体」という広い意味で使われることが多いです。
歴史と背景
- 1960年代:大型コンピューターでのデータ管理が始まる。データの構造はプログラムに埋め込まれており、設計図という概念は明確ではなかった
- 1970年:Edgar F. Codd(IBM)が関係モデル(Relational Model)を提唱。テーブル・行・列という構造が理論化され、スキーマという概念が体系化される
- 1974年:IBM が SEQUEL(後の SQL)を開発。
CREATE TABLEなどのDDLによってスキーマを明示的に定義できるようになった - 1987年:ISO/IEC が SQL を国際標準として制定(SQL-87)。スキーマの定義方法が標準化される
- 1990年代:Oracle、MySQL、PostgreSQL などの商用・OSSデータベースが普及。スキーマ設計は業務システム開発の標準工程として定着
- 2000年代:XML Schema、JSON Schema など、データベース以外でもデータ構造定義に「スキーマ」という概念が広く使われるようになる
- 2010年代〜:NoSQLデータベース(MongoDB等)の台頭で「スキーマレス(事前定義不要)」という設計も登場。スキーマの有無がシステム選定のポイントになる
スキーマあり vs スキーマレス
現代のシステム開発では、スキーマを事前に厳密に定義するスキーマあり型と、定義なしに柔軟にデータを扱うスキーマレス型の2つのアプローチがあります。
| 比較項目 | スキーマあり(RDB) | スキーマレス(NoSQL) |
|---|---|---|
| 事前定義 | 必須 | 不要 |
| データ整合性 | 高い | アプリ側で担保 |
| 仕様変更への対応 | やや硬直 | 柔軟 |
| 複雑な集計・検索 | 得意 | 苦手なケースも |
| 代表製品 | MySQL, PostgreSQL | MongoDB, DynamoDB |
JSON Schema・XML Schema との関連
「スキーマ」はデータベースだけの概念ではありません。APIやファイルのデータ構造定義にも使われます。
| 種類 | 使われる場面 | 例 |
|---|---|---|
| DB スキーマ | リレーショナルDB の構造定義 | CREATE TABLE |
| JSON Schema | REST API のリクエスト・レスポンス検証 | OpenAPI / Swagger |
| XML Schema(XSD) | XML ファイルの構造検証 | 電子申請・EDI |
| GraphQL Schema | GraphQL API の型定義 | type User { id: ID! } |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| ISO/IEC 9075-1 | SQL の国際標準。スキーマ定義(DDL)を含む |
| RFC 8927 | JSON Type Definition(JTD): JSON スキーマの標準化仕様 |
| RFC 6901 | JSON Pointer: JSON 構造内の要素参照(スキーマと組み合わせて利用) |