[TypeORM] Many-to-many 관계 (@ManyToMany)

cabbage·2023년 2월 5일
0

ORM

목록 보기
3/7
post-thumbnail
post-custom-banner

Many-to-many 관계 (@ManyToMany)

  • Many-to-many 는 다음과 같은 관계를 말한다.
  • A가 B의 여러 인스턴스를 포함하고, B도 A의 여러 인스턴스를 포함한다.
  • QuestionCategory 엔티티 예시
    • 하나의 질문은 여러 카테고리를 가질 수 있다.
    • 각각의 카테고리에는 여러 질문들이 있을 수 있다.
    • QuestionCategory 는 many-to-many 관계(N : M 관계)이다.
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm"
import { Question } from "./Question"

@Entity()
export class Category {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    name: string

    @ManyToMany(() => Question, (questions) => questions.categories)
	questions: Question[]
}
import {
    Entity,
    PrimaryGeneratedColumn,
    Column,
    ManyToMany,
    JoinTable,
} from "typeorm"
import { Category } from "./Category"

@Entity()
export class Question {
    @PrimaryGeneratedColumn()
    id: number

    @Column()
    title: string

    @Column()
    text: string

    @ManyToMany(() => Category, (categories) => categories.questions)
    @JoinTable()
    categories: Category[]
}
  • @ManyToMany 관계에서 @JoinTable 은 필수이다.
  • Many-to-many 관계의 한 쪽 엔티티에 반드시 @JoinTable 을 작성해야 한다.
  • Many-to-many 관계의 두 엔티티에는 모두 @ManyToMany 를 붙인 칼럼을 추가해 연결해야 한다.
  • (questions) => questions.categories
    • questions 입장에서 categories 와의 관계를 명시한다.
    • Many-to-many 관계에서 두 테이블의 관계를 명시해야 한다.
  • (categories) => categories.questions
    • categories 입장에서 questions 와의 관계를 명시한다.
    • Many-to-many 관계에서 두 테이블의 관계를 명시해야 한다.
  • questions: Question[]
    • 하나의 카테고리에 여러 질문이 포함될 수 있으므로 배열로 나타낸다.
  • categories: Category[]
    • 하나의 질문이 여러 카테고리에 포함될 수 있으므로 배열로 나타낸다.
  • 위 예제는 다음과 같은 테이블을 만든다. 스크린샷 2023-02-05 오후 9.11.15.png
  • “N : M 관계”, 즉 many-to-many 관계를 두 테이블로만 표현할 수 없기 때문에 “연결 테이블”을 통해 many-to-many 관계의 두 테이블을 표현한다.
    • question_categories_category 연결 테이블
  • QuestionCategory 테이블의 두 PK가 연결 테이블의 FK로 포함된 것을 확인할 수 있다.

참고

profile
캐비지 개발 블로그입니다. :)
post-custom-banner

0개의 댓글