Prisma JsonフィールドからSQL JSONBとJSONカラムへの変換
Prisma JsonフィールドがPostgreSQLのJSONB、MySQLのJSON、SQLiteのTEXTにどのようにマッピングされるかを学びます。JSONカラムに構造化データを格納するトレードオフを理解します。
Advanced
詳細な説明
Json型のマッピング
PrismaのJson型は任意のJSONデータを単一カラムに格納できます。SQL出力はダイアレクトのJSONサポートに依存します。
デフォルトのマッピング
| Prisma | PostgreSQL | MySQL | SQLite |
|---|---|---|---|
Json |
JSONB | JSON | JSON |
Prismaスキーマの例
model UserPreference {
id Int @id @default(autoincrement())
userId Int @unique @map("user_id")
theme String @default("dark")
settings Json
metadata Json?
@@map("user_preferences")
}
生成されるSQL(PostgreSQL)
CREATE TABLE user_preferences (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL UNIQUE,
theme VARCHAR(255) NOT NULL DEFAULT 'dark',
settings JSONB NOT NULL,
metadata JSONB
);
PostgreSQLのJSONB vs JSON
PostgreSQLは2つのJSON型を提供します:
- JSON: 生のJSONテキストを格納。空白、キーの順序、重複キーを保持。アクセスのたびに解析が発生。
- JSONB: 分解されたバイナリ形式でJSONを格納。読み取りが高速、インデックス作成(GINインデックス)をサポート、ただし書き込みはわずかに遅い。ほとんどのユースケースで推奨される選択肢であるため、変換ツールはPostgreSQLではJSONBをデフォルトにします。
MySQL JSON
MySQLのJSON型はJSONをバイナリ形式で検証・格納します(JSONBと類似)。生成カラムによるインデックスをサポートし、クエリ用の組み込みJSON関数があります。
SQLite JSON
SQLiteはJSONを通常のテキストとして格納します(バージョン3.38.0以降JSONサブタイプがありますが、ストレージは依然としてテキスト)。SQLiteはクエリ用のJSON関数を提供しますが、挿入時のネイティブな検証はありません。
Jsonフィールドの使い時
Jsonフィールドは、ユーザー設定、設定オブジェクト、APIレスポンスキャッシュなど、レコード間でスキーマが異なる可能性のある半構造化データに最適です。固定構造のデータには、クエリパフォーマンスと型安全性を向上させるために別々のカラムの使用を検討してください。
ユースケース
各ユーザーがダッシュボードレイアウト、通知設定、表示オプションをカスタマイズできるユーザー設定機能を構築しています。JSONカラムを使用すると、すべてのオプションに新しいカラムを追加せずに柔軟な設定を格納できます。