[Node.js 입문]

1 : N, N : M 관계?

호지98 2024. 6. 3. 20:42

1: N (One-to-Many) 관계

1 : N관계는 하나의 엔터티가 여러 엔터티와 연관되어 있을 때 사용된다. 예를 들어, 한 명의 작가가 여러 개의 책을 저술할 수 있는 경우, 작가와 책 사이에 1 : N관계가 있다.

기준

  • **주 엔터티(Parent Entity)**가 있고, **자식 엔터티(Child Entity)**가 여러 개 존재할 때.
  • 자식 엔터티가 주 엔터티에 종속되어 있을 때.
  • 주 엔터티의 한 레코드가 자식 엔터티의 여러 레코드와 연관될 때.

예시

  • 한 사용자(User)가 여러 게시물(Post)를 작성할 수 있음.
  • 한 블로그 게시물(Post)이 여러 댓글(Comment)을 가질 수 있음.

Prisma Schema 예시

//prisma schema
model User {
  id     Int      @id @default(autoincrement())
  name   String
  posts  Post[]
}

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

N: M (Many-to-Many) 관계

N :  M 관계는 여러 엔터티가 여러 엔터티와 연관되어 있을 때 사용된다. 예를 들어, 여러 학생이 여러 과목을 수강할 수 있는 경우, 학생과 과목 사이에 N : M관계가 있다.

기준

  • 두 엔터티가 서로 독립적이며, 각 엔터티의 여러 레코드가 다른 엔터티의 여러 레코드와 연관될 때.
  • 서로 대등한 관계를 맺고 있을 때.
  • 중간 테이블을 통해서 관계가 형성될 때.

예시

  • 여러 학생(Student)이 여러 과목(Course)을 수강할 수 있음.
  • 여러 사용자(User)가 여러 태그(Tag)를 가질 수 있음.

Prisma Schema 예시

model User {
  id     Int     @id @default(autoincrement())
  name   String
  tags   Tag[]   @relation("UserTags")
}

model Tag {
  id     Int     @id @default(autoincrement())
  name   String
  users  User[]  @relation("UserTags")
}

model UserTag {
  userId Int
  tagId  Int
  user   User @relation(fields: [userId], references: [id])
  tag    Tag  @relation(fields: [tagId], references: [id])
  @@id([userId, tagId])
}

 

관계 설정의 기준 요약

  1. 1 : N관계: 주 엔터티가 자식 엔터티를 여러 개 가질 때.
    • 주 엔터티가 하나의 레코드에 여러 자식 레코드를 가짐.
    • 자식 엔터티는 하나의 주 엔터티에 속함.
  2. N : M관계: 두 엔터티가 서로 대등하며, 여러 개의 각 엔터티 레코드가 서로 연관될 때.
    • 중간 테이블이 필요.
    • 두 엔터티의 여러 레코드가 다른 엔터티의 여러 레코드와 관계를 맺음.

이러한 기준을 통해 데이터베이스 모델링 시 각 엔터티 간의 관계를 올바르게 설정할 수 있다.