Many-to-many 관계 (@ManyToMany)
Many-to-many
는 다음과 같은 관계를 말한다.
- A가 B의 여러 인스턴스를 포함하고, B도 A의 여러 인스턴스를 포함한다.
Question
과 Category
엔티티 예시
- 하나의 질문은 여러 카테고리를 가질 수 있다.
- 각각의 카테고리에는 여러 질문들이 있을 수 있다.
Question
과 Category
는 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[]
- 하나의 질문이 여러 카테고리에 포함될 수 있으므로 배열로 나타낸다.
- 위 예제는 다음과 같은 테이블을 만든다.
- “N : M 관계”, 즉 many-to-many 관계를 두 테이블로만 표현할 수 없기 때문에 “연결 테이블”을 통해 many-to-many 관계의 두 테이블을 표현한다.
question_categories_category
연결 테이블
Question
과 Category
테이블의 두 PK가 연결 테이블의 FK로 포함된 것을 확인할 수 있다.
참고