【すきーま】

スキーマ とは?

💡 データベースの「設計図」、テーブル構造や制約を定義したもの
📌 このページのポイント
スキーマ — データベースの設計図 users テーブル 🔑 id: INTEGER name: VARCHAR(50) email: VARCHAR(100) created_at: TIMESTAMP NOT NULL / UNIQUE制約 orders テーブル 🔑 id: INTEGER 🔗 user_id: INTEGER total: DECIMAL status: VARCHAR(20) 外部キー: users.id 1:N 構造を定義 テーブル・カラム データ型の設計 制約を設定 NOT NULL / UNIQUE 外部キー制約 データの整合性を保証 不正データの混入を スキーマレベルで防止
スキーマ(データベース設計図)のイメージ
ひよこ ひよこ

スキーマって何?

ペンギン先生 ペンギン先生

データベースの「設計図」のことだよ。「usersテーブルはid・name・emailというカラムを持ち、idはINT・nameはVARCHAR(50)・emailはUNIQUEにする」という定義がスキーマ。

ひよこ ひよこ

スキーマ変更(マイグレーション)が怖いって聞いたけど?

ペンギン先生 ペンギン先生

本番DBのスキーマ変更はリスクが伴う。例えばカラムを追加する間もサービスは動き続ける必要がある。また大きなテーブルカラム変更は時間がかかりロックが発生する。マイグレーションツール(Rails Migrationなど)を使って安全に変更するのが重要。

ひよこ ひよこ

JSONのスキーマとは違うの?

ペンギン先生 ペンギン先生

概念は同じだけど対象が違う。RDBのスキーマはDBの構造定義、JSON Schemaはどんなキー・値・型を持つJSONか定義するもの。「このAPIのリクエストはこういう形のJSONを期待している」という定義に使う。

ひよこ ひよこ

スキーマレスのデータベースもあるって聞いたんだけど?

ペンギン先生 ペンギン先生

MongoDBのようなNoSQLデータベースは事前にスキーマを定義しなくても使えるよ。ただしスキーマレスは「何でも入れられる」反面、データの整合性が保証されないから、アプリケーション側でバリデーションが必要になる。MongoDBも後からMongoose等でスキーマを定義して使うことが多いんだ。

ひよこ ひよこ

GraphQLのスキーマってDBのスキーマとは違うの?

ペンギン先生 ペンギン先生

概念は似ているけど対象が違うんだ。DBスキーマはデータの保存構造を定義するもの、GraphQLスキーマはAPIが返すデータの型と関係を定義するもの。GraphQLでは「type User { id: ID!, name: String!, posts: [Post!]! }」のようにAPIの入出力の型を厳密に定義する。スキーマファーストで開発するとフロントエンドバックエンドが独立して開発を進められるのがメリットだよ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
スキーマって出てきたら「データベースの構造定義(テーブル・カラム・制約の設計図)」と思えばOK!
📖 おまけ:英語の意味
「Schema」 = 図式・構造・枠組み
💬 ギリシャ語のschema(形・外観)から。データをどのように「形作るか」の設計を表す
← 用語集にもどる