스키마 작성 방법 (feat. Prisma에서 데이터 모델 정의하는 방법)

Leticia·2024년 3월 1일
0

Database

목록 보기
3/5

How?

1. 모델 정의:

  • 각 모델은 데이터베이스의 테이블에 해당
  • 모델의 이름은 PascalCase로 지정하고, 필드는 해당 테이블의 열에 해당
  • PascalCase : 단어의 첫글자 - 대문자 && 단어사이에 공백 NONO && 모든 단어 연이어 (ex.ProductCategory )

2. 필드 정의:

  • 각 모델 내에서 필드는 해당 테이블의 열을 나타냄
  • 필드의 이름은 camelCase로 작성하며, 데이터 타입과 함께 지정됩니다. 예를 들어, 문자열은 String, 정수는 Int, 부울은 Boolean 등으로 표현
  • CamelCase : 첫번째를 제외한 나머지단어의 시작은 대문자로 (ex. firstName)

3. 기본 키 및 관계 정의:

  • 모델 내의 필드 중 하나를 기본 키(primary key)로 지정할 수 있음
  • 기본 키는 @id 데코레이터를 사용하여 지정
  • 모델 간의 관계를 정의할 수 있으며, @relation 데코레이터를 사용하여 관계를 설정

4. 추가 옵션 정의:

  • 모델 내의 필드에 대한 추가 옵션 O
  • 필드의 기본값(default), 고유성(unique), 필수 여부(required), 자동 증가(autoincrement) 등

    5, Enum 정의:
  • 필드가 특정한 값 중 하나를 가져야 하는 경우 Enum을 사용하여 가능한 값들을 정의 0

Prisma 스키마의 예시

// 카테고리 모델
model Category {
  id       Int      @id @default(autoincrement())
  name     String
  description String?   // ? 표시는 null 값 허용
  // 카테고리와 메뉴 간의 일대다 관계
  menus    Menu[]
}

// 메뉴 모델
model Menu {
  id          Int       @id @default(autoincrement())
  name        String
  price       Int ?
  description String @db.Text @map("description")
  isActive Boolean @default(true)
  createdAt DateTime @default(now())
  category    Category? @relation(fields: [categoryId], references: [id])
  categoryId  Int?
}
  • name String : Prisma에서는 기본적으로 필드의 null 값을 허용하지 않는다. 필수(required)로 간주로 간주
    db 저장시 필드 값이 항상 존재해야함)

  • price Int ? : null 값이 허용될 경우 데이터탙입 뒤에 ? 붙여

  • description String @db.Text : 긴 텍스트 사용시

    • 외래 키(Foreign Key) 는 부모테이블의 (참조할) 필드. 이키는 자식 테이블에 추가됨

    • isActive Boolean @default(true) : 데이터 삽입될때 기본적으로 'true' 설정

    • createdAt DateTime @default(now()) : 데이터 삽입시 현재 날짜와 시간 자동 추가

      연관 관계 맺기

      1:N 관계

      자식테이블에서는

      categoryId Int @map("categoryId") // 부모테이블 필드 선언
      
      category Categories @relation(fields:[categoryId], references:[categoryId], onDelete: Cascade) // 관계
      
    1. 참조할 부모 테이블 필드 를 자식 테이블에 선언

    2. @relation으로 관계 맺기
      (fiedls : 현재 자식테이블의 외래키인 categoryId, references : [부모모델 categoryId 필드] , 참조될 열(부모 행)이 삭제시 자식행도 함께 삭제)

      부모테이블에서는

    menus Menus[]  // 1:n 연관관계 (자식 테이블의 모델 )

`자식 테이블의 모델`을 추가한다

 
## 1:1 관계


````js
model User {
  id       Int      @id @default(autoincrement())
  username String
  userInfo UserInfo? 
}

model UserInfo {
  id       Int      @id @default(autoincrement())
  user     User     @relation(fields: [userId], references: [id]) ..
  userId   Int      @unique  // 부모 테이블 필드
}

자식 테이블

  • 참조할 부모 테이블 필드 선언 + @unique 추가해주기

  • @relation으로 관계 맺기 ( field : 현재 이테이블에서 불리는 이름, reference : 부모테이블의 필드이름)

  • userInfo UserInfo? 인 이유는? : 1:1에서 자주 사용되는 패턴중에 하나인데 때로는 모든 사용자에 대해 연결된 정보가 없을 수 있기 때문에 이러한 관계를 옵셔널하게 만들어야 함

    ex) 만약 UserInfo가 생성되지 않은 경우에는 해당 사용자의 UserInfo 필드에는 null이 할당됨
    근데 optional 설정을 하지 않았을 경우 prisma는 기본(필수 필드)이 null 불가이기 때문에 아직 생성되지 않은 사용자에 대해 오류가 발생할수 있음
    ? 로 하면 이렇게 하면 사용자에 대한 연결된 정보가 없는 경우에도 오류를 방지할수 있음

profile
Hi Hi

0개의 댓글