Prisma 1対多リレーションからSQL FOREIGN KEYへの変換

1対多リレーションのPrisma @relationをSQL FOREIGN KEY制約に変換します。fields、references、リレーションフィールドがSQLにどのようにマッピングされるかを学びます。

Relations

詳細な説明

1対多リレーションの変換

Prismaの1対多リレーションは、スカラー外部キーフィールド、@relation属性、および関連モデルの逆リレーションフィールド(配列)の組み合わせで定義されます。

Prismaスキーマの例

model Author {
  id    Int    @id @default(autoincrement())
  name  String
  books Book[]

  @@map("authors")
}

model Book {
  id       Int    @id @default(autoincrement())
  title    String
  authorId Int    @map("author_id")
  author   Author @relation(fields: [authorId], references: [id])

  @@map("books")
}

生成されるSQL

CREATE TABLE authors (
  id SERIAL PRIMARY KEY,
  name VARCHAR(255) NOT NULL
);

CREATE TABLE books (
  id SERIAL PRIMARY KEY,
  title VARCHAR(255) NOT NULL,
  author_id INTEGER NOT NULL,
  FOREIGN KEY (author_id) REFERENCES authors (id)
);

変換の仕組み

  1. リレーションフィールド(author Author はスキップされます — SQLカラムに対応するものがありません。Prismaの型安全なクエリのためだけに存在します。
  2. 配列フィールド(books Book[] もスキップされます — 「多」側は子テーブルの外部キーで表現されます。
  3. スカラーフィールド(authorId Int は通常のSQLカラムになります。
  4. @relation(fields: [authorId], references: [id])author_idからauthors.idを指すFOREIGN KEY制約を生成します。

オプションのリレーション

リレーションがオプション(外部キーフィールドがnullable)の場合、FOREIGN KEYは存在しますがカラムはNULLを許可します:

model Book {
  id       Int     @id @default(autoincrement())
  title    String
  authorId Int?    @map("author_id")
  author   Author? @relation(fields: [authorId], references: [id])
}

author_id INTEGER(NOT NULLなし)と同じFOREIGN KEY制約が生成されます。

外部キーのインデックス

パフォーマンスのために、外部キーカラムにインデックスを追加するのが一般的です。Prismaの@@index([authorId])を使用してCREATE INDEX文を生成します。

ユースケース

各著者が複数の書籍を持てる図書管理システムのデータベーススキーマを文書化しており、Prismaが作成する正確なFOREIGN KEY制約をDBAに示す必要があります。

試してみる — Prisma to SQL Schema

フルツールを開く