schema.prisma에 작성한 model들 사이에 1대1, 1대N, N대M의 관계가 있을 경우 @relation 을 사용하여 관계를 정의하고 관계된 모델들을 매핑해준다. 공식문서
model Board {
id Int @id @default(autoincrement())
title String @db.VarChar(30)
createdAt DateTime @default(dbgenerated("NOW()")) @db.DateTime
updatedAt DateTime @default(dbgenerated("NOW() ON UPDATE NOW()")) @db.DateTime
posts Board[] @relation("PostsToBoard")
}
model Post {
id Int @id @default(autoincrement())
boardId Int
title String @db.VarChar(30)
content String @db.VarChar(2000)
createdAt DateTime @default(dbgenerated("NOW()")) @db.DateTime
updatedAt DateTime @default(dbgenerated("NOW() ON UPDATE NOW()")) @db.DateTime
board Board @relation("PostsToBoard", fields: [boardId], references: [id], onDelete: Cascade)
answer Answer? @relation("AnswerToPost")
}
model Answer {
id Int @id @default(autoincrement())
postId Int @unique
content String @db.VarChar(2000)
createdAt DateTime @default(dbgenerated("NOW()")) @db.DateTime
updatedAt DateTime @default(dbgenerated("NOW() ON UPDATE NOW()")) @db.DateTime
post Post @relation("AnswerToPost", fields: [postId], references: [id])
}
위와 같이 Board와 Post가 1대N의 관계가 있고, Post가 Answer가 1대1의 관계가 있을 때, 관계의 이름을 정의하고 플래그가 되는 필드와 해당 플래그가 참조하는 필드를 입력하여 관계를 작성한다.
위 schema의 경우 게시글에 답변이 달릴 경우 1:1의 관계가 성립이 되기 때문에 관계의 주인은 Answer가 된다. 따라서 Post의 answer 필드는 Nullable이 True가 되고 별다른 설정없이 관계의 이름만 @relation에 추가해준다.
그리고 Answer는 생성되는 순간 특정 Post가 매핑이 되기 위해 postId 필드를 플래그로 가지고 있고, post 필드 또한 가지며, postId 필드는 Post의 id를 참조한다는 것을 @relation에 입력한다.
하나의 Board는 N개의 Post를 가질 수 있다. 이 관계는 Post가 어떤 Board를 참조하여 생성될 때 맺어지므로 관계의 주인은 Post가 된다. 따라서 Board의 posts[] 필드에는 Nullable 속성을 True로 주고 @relation에도 관계의 이름만 입력한다.
Post는 Board의 id를 참조하는 boardId 필드와 Board 타입의 board 필드를 갖고, 해당 boardId 필드가 Board의 id 필드를 참조한다는 것을 나타낸다.
위 스키마에는 없지만 N:M관계의 작성법 또한 비슷하다.
예를 들어, 하나의 답변이 여러개의 게시글에 달릴 수 있고, 하나의 게시글이 여러개의 답변을 가질 수 있는 다대다 관계라면 아래와 같이 작성한다.
model Post {
...
answers Answer[] @relation("AnswersToPosts")
...
}
model Answer {
...
posts Posts[] @relation("AnswersToPosts")
...
}
위와 같이 관계의 양측 필드 모두 배열임을 나타내주고 관계의 이름만 정의하면 해당 관계는 다대다 관계임을 인지하고 prisma가 자체적으로 두 model을 매핑하는 테이블을 생성하여 관리해준다 (implicit Many-to-Many relation). 물론 명시적으로 model을 직접 만들어 관리를 할 수도 있다(explicit Many-to-Many relation).