본문 바로가기

백엔드/Prisma + GraphQL

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

서로 다른 테이블의 레코드를 1:1로 매칭시킵니다. 

사용예 (Usecase)

User.profile ↔ Profile.userId

 

다음은 User 테이블의 profile(Profile 타입) 컬럼을 Profile 테이블의 레코드에 1:1로 연결시킨 예입니다.

schema.prisma

model User {
  id      Int       @default(autoincrement()) @id
  profile Profile?  // Nullable
}

model Profile {
  id        Int     @id @default(autoincrement())
  user      User    @relation(fields: [userId], references: [id])
  userId    Int
  bio       String? // Nullable
}

Prisma2부터 Relation으로 설정된 속성은 컬럼이 생성되지 않습니다.

따라서 Profile 테이블에서 user 컬럼은 생성되지 않고, userId 컬럼만 생성됩니다.

user는 Relation으로 설정된(@relation) 타입(User)의 id(references)를 참조해서 userId(fields)에 저장하고, userId를 사용해서 User 객체에 접근하는 매커니즘 정의한 속성입니다.

 

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

prisma.user.create({
    data: {
    	profile: {
        	create: {
            	bio: "안녕하세요."
            }
        }
    }
})

prisma.user.delete({
    where: {
    	id: <id>
    }
})

User와 Profile이 Relation으로 연결됐기 때문에, User.profile을 이용해서 Profile 레코드에 접근할 수 있고, Profile.userId를 사용해 User 레코드에 접근할 수 있습니다. 그리고  User 레코드를 삭제하면 Profile 레코드도 함께 삭제됩니다.

어쩌라고?

그냥 User 테이블에 이름, 자기소개 등의 프로필 정보를 넣어도 될 것 같습니다.

하지만 데이터베이스의 Relation은 CRUD를 수행할 때 상당히 유용한 기능입니다. 그리고 Prisma의 Relation데이터베이스의 Relation과 동일한 개념입니다. 나중에 Prisma 모델로 부터 데이터베이스 테이블이 생성되는데, 이때 Prisma의 Relation이 그대로 데이터베이스의 Relation으로 적용됩니다.

참조: Prisma2 CLI를 사용하여 데이터베이스 테이블 생성

 

예를 들면, Post 테이블의 어떤 레코드에 연결된 Comment 테이블의 모든 레코드를 얻고 싶을 때, 또는 Comment 레코드를 생성할 때 Post 테이블의 특정 레코드에 연결할 때와 같이 Post 테이블과 Comment 테이블이 Relation으로 연결되어 있다면, Post 또는 Comment 테이블에 CRUD 작업을 할 때, 위와 같이 두 레코드간의 관계를 직관적으로 지정할 수 있어서 매우 유용합니다. 

위의 경우는 1:N Relation이지만, 1:1 Relation1:N Relation Self Relation을 이해하기 위한 기초가 될 것 같아 포스팅을 했습니다. 제일 쉬우니까요.

인스타그램 클론코딩 백앤드에도 1:1 Relation을 사용하지 않았습니다. First name, Last name, bio 등 Profile 타입에 있어도 될 속성을 모두 User 타입에 넣었습니다.

Prisma 모델로 부터 생성된 데이터베이스 테이블

schema.prisma 파일로 부터 생성된 Profile 테이블 정의입니다. 제가 직접한 것은 아니고, Prisma CLI가 자동으로 수행한 것을 HeildSQL 프로그램으로 확인한 겁니다.

schema.prisma 파일을 사용하여 데이터베이스 테이블을 생성하는 방법은 다른 포스트에서 생성해 보겠습니다.

참고: Prisma2 CLI를 사용하여 데이터베이스 테이블 생성

 

테이블 생성 SQL을 보면 Prisma 모델을 따르고 있는 것을 확인할 수 있습니다. 

Prisma 모델로 부터 생성된 데이터베이스 테이블

출처: https://www.prisma.io/docs/reference/tools-and-interfaces/prisma-schema/relations#one-to-one-relations