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)
);
変換の仕組み
- リレーションフィールド(
author Author) はスキップされます — SQLカラムに対応するものがありません。Prismaの型安全なクエリのためだけに存在します。 - 配列フィールド(
books Book[]) もスキップされます — 「多」側は子テーブルの外部キーで表現されます。 - スカラーフィールド(
authorId Int) は通常のSQLカラムになります。 @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に示す必要があります。