[Prisma] Schema 모델링 - Relation 관계 설정하기

koline·2023년 11월 14일

prisma

목록 보기
4/6

Schema 모델링 - Relation 관계 설정하기


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])
}

위와 같이 BoardPost가 1대N의 관계가 있고, PostAnswer가 1대1의 관계가 있을 때, 관계의 이름을 정의하고 플래그가 되는 필드와 해당 플래그가 참조하는 필드를 입력하여 관계를 작성한다.

1:1 관계

위 schema의 경우 게시글에 답변이 달릴 경우 1:1의 관계가 성립이 되기 때문에 관계의 주인은 Answer가 된다. 따라서 Postanswer 필드는 NullableTrue가 되고 별다른 설정없이 관계의 이름만 @relation에 추가해준다.

그리고 Answer는 생성되는 순간 특정 Post가 매핑이 되기 위해 postId 필드를 플래그로 가지고 있고, post 필드 또한 가지며, postId 필드는 Postid를 참조한다는 것을 @relation에 입력한다.

1:N 관계

하나의 Board는 N개의 Post를 가질 수 있다. 이 관계는 Post가 어떤 Board를 참조하여 생성될 때 맺어지므로 관계의 주인은 Post가 된다. 따라서 Boardposts[] 필드에는 Nullable 속성을 True로 주고 @relation에도 관계의 이름만 입력한다.

PostBoardid를 참조하는 boardId 필드와 Board 타입의 board 필드를 갖고, 해당 boardId 필드가 Boardid 필드를 참조한다는 것을 나타낸다.

N:M 관계

위 스키마에는 없지만 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).

profile
개발공부를해보자

0개의 댓글