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カラムを使用すると、すべてのオプションに新しいカラムを追加せずに柔軟な設定を格納できます。

試してみる — Prisma to SQL Schema

フルツールを開く