[TypeORM] Many-to-one, One-to-many 관계(@ManyToOne, @OneToMany)

cabbage·2023년 2월 5일
0

ORM

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

Many-to-one / one-to-many relations(@ManyToOne, @OneToMany)

  • Many-to-one , One-to-many 는 다음과 관계를 말한다.
  • A가 B의 여러 인스턴스를 포함하지만, B는 오직 A의 인스턴스 하나만 포함한다.
  • UserPhoto 엔티티 예시
    • 유저는 여러 사진을 가질 수 있다.
    • 하지만 각각의 사진은 하나의 유저에게만 속한다.
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm"
import { User } from "./User"

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

    @Column()
    url: string

    @ManyToOne(() => User, (user) => user.photos)
    user: User
}
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm"
import { Photo } from "./Photo"

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

    @Column()
    name: string

    @OneToMany(() => Photo, (photo) => photo.user)
    photos: Photo[]
}
  • Userphotos 프로퍼티에 @OneToMany 를 추가하고 Photo 를 대상 관계 타입으로 지정하였다.
  • @ManyToOne, @OneToMany 관계의 경우 @JoinColumn 을 생략할 수 있다.
  • @OneToMany@ManyToOne 없이 존재할 수 없다.
  • 따라서 @OneToMany 를 사용하려면 @ManyToOne 이 필수적이다.
  • 하지만 그 반대는 필수적이지 않다.
  • @ManyToOne 관계만 고려한다면 @OneToMany 는 필수적이지 않다.
  • @ManyToOne 을 설정한 엔티티는 “관계id”와 FK(외래키)를 포함하게 된다. 스크린샷 2023-02-05 오후 5.38.28.png
  • @ManyToOne 을 설정한 Photo 테이블은 userId 라는 칼럼을 FK(외래키)로 포함하고 있다.

@ManyToOne 을 설정한 엔티티에 대상 관계 엔티티의 PK가 담기는 이유가 뭘까 생각해 봤는데, 아래와 같은 이유라고 볼 수 있을 것 같다.

  • 사진 입장에서 유저와의 관계는 "N : 1 관계"이다.
  • 여러 사진은 하나의 유저에게 속할 수 있기 때문에 userID 칼럼을 FK로 포함하는 것이 효율적이다.
  • 만약 User 테이블이 photoId 라는 칼럼으로 FK(외래키)를 포함하게 되면 데이터 중복이 발생하므로 비효율적이다.

참고

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

0개의 댓글