본문 바로가기

백엔드/Prisma + GraphQL

Prisma2 데이터 모델링2 - 1:N Relation

한 개의 레코드와 다른 테이블의 다수 레코드를 1:N으로 매칭시킵니다.

사용예(Usecase)

User.post ↔ Post

Post.comments ↔ Commnet

 

1:1 Relation과 거의 동일합니다. 다음은 User 테이블의 Posts 레코드에 다수의 Post 테이블 레코드를 연결시킨 예제입니다. 단지 다수의 레코드가 연결된 한 개의 레코드가 배열 타입으로 변경됐을 뿐입니다.

schema.prisma

model User {
  id          Int       @default(autoincrement()) @id
  posts       Post[]
}

model Post {
  id          Int     @default(autoincrement()) @id
  user        User    @relation(fields: [userId], references: [id])
  userId      Int
}

참조: Prisma2 데이터 모델링1 - 1:1 Relation

 

인스타그램 클론코딩 백앤드는 대부분 1:N Relation으로 구성되어 있습니다.

 

한 개의 User 레코드에 다수의 Post 레코드를 연결하고, 한 개의 Post 레코드에 다수의 Comment, File, Like 레코드를 연결했습니다.

Prisma2 데이터 모델링2 - 1:N Relation

위의 Prisma 모델로 부터 생성된 Prisma 클라이언트로 다음과 같이 User, Post, File 레코드를 연결시켜서 CRUD 작업을 할 수 있습니다. 

// id가 <id>인 User와 연결된 Post 레코드 생성
const post = await prisma.post.create({
    data: {
        caption,
        location,
        user: {
            connect: {
                id: me.id
            }
        }

    }
});

참고로 User와 Post는 1:N으로 연결되어 있습니다.

참조: [인스타그램 클론코딩] Prisma2 데이터 모델링

 

위와 같이 Relation으로 연결해 놓으면 다음과 같이 User에서 Post를 검색하거나 Post에서 User를 직관적으로 검색할 수 있습니다.

// userId가 user.id인 모든 Post 레코드 검색
const posts = await prisma.post.fineMany({
    where: {
        userId: user.id
    }
})

// ID가 posts[0].userId인 User 레코드 검색
const user = await prisma.user.findOne({
    where: {
        id: posts[0].userId
    }
})