우리가 Velog 개발자
라고 가정하자.
유저가 글을 포스팅한다.
이에 대한 schema를 어떻게 작성할 것인가?
유저가 작성한 글에서 우리는 어떤 정보
가 필요할까?
수 많은 Post들을 관리하기 위한 고유한 id
다른 유저에게 보여줄 제목인 title
해당 글의 내용인 content
해당 글의 공개여부를 결정하는 published
글쓴이와 해당 유저의 블로그에 들어가면 글을 모아볼 수 있는 author id
가 필요할 것이다.
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User? @relation(field: [authorId])
authorId Int?
}
따라서 Velog는 위와 같은 schema를 데이터베이스에서 사용할 것이다.
관계형 데이터베이스에서 존재하지 않는 id를 참조
할 때, 에러가 발생하는 건 너무 직관적으로 받아들여진다.
하지만 PlanetScale
은 Scaling에 초점을 두었기 때문에, 참조한 객체의 존재여부를 확인하는 과정이 생략
된다.
따라서 PlanetScale에서 참조 무결성(Referential integrity)을 보증하기 위해, Prisma
를 컴파일러로 사용할 수 있다.
이에 대한 코드는 아래와 같다.
generator client {
provider = "prisma-client-js"
previewFeatures = ["referentialIntegrity"]
//1. 다른 객체에 연결할 때, 객체의 존재를 확정받음.
}
datasource db {
provider = "mysql"
url = env("DATABASE_URL")
referentialIntegrity = "prisma"
//2. 그 확정을 prisma로 받겠음.
}
DataBase에서 만들 Schema를 생성했다면, 이를 PlanetScale로 Push해야한다.
npx prisma db push
Prisma의 참조 무결성(referentialIntegrity) 설정을 DB와 connect한 이후 변경
했다면, 터미널에서 PlanetScale을 종료한 다음, 재실행 해주어야 한다.
pscale connect {DB이름}
Error: Command failed with ENOENT: yarn add @prisma/client@4.6.1
spawn yarn ENOENT
위와 같은 오류가 발생한다면 yarn이 없어 prisma가 PlanetScale에 push를 하지 못하는 경우이다. yarn을 설치해주자.
npm install --global yarn