웹 백엔드

Node.js - Sequelize를 활용한 테이블 관계 설정(relation)

토리쟁이 2024. 2. 20. 20:51

 

 

이번 포스팅에서는, 지난 포스팅에서 공부했었던 sequelize를 활용하여 테이블 간 관계를 설정해보려고 한다.


 

JOIN은 SQL의 핵심 문법이라고 할 수 있다. JOIN은, 2개 이상의 테이블에서 데이터를 결합하여 새로운 결과를 생성해낼 수 있기 때문에 테이블 간의 관계를 통해 의미있는 정보를 얻어낼 수 있다.

 

JOIN에 관해서는 아래 포스팅에 간단히 정리해 놓았다.

https://hellotoriworld.tistory.com/21 

 

SQL 기초5 - 조인

이번 포스팅에서는 SQL의 핵심적인 문법이라고 할 수 있는 JOIN에 대해 다뤄보고자 한다. 조인이란 무엇일까? JOIN DB에서 2개 이상의 테이블을 연결하여 하나의 테이블로 합치는 것 데이터를 효율

hellotoriworld.tistory.com

 


따라서, 이전 포스팅에서 다루었었던 sequelize로 테이블을 생성, 삭제 및 데이터 삽입(추가), 수정, 삭제 등.. 을 하는 작업도 중요하지만, JOIN을 수행하기 위해서는 테이블 간 관계를 설정하는 것도 매우 중요한 부분이다.

 

그렇기 때문에, 이번 포스팅에서는 sequelize를 활용한 테이블 간 관계 설정에 대해 다루어 볼 것이다.

 

 

관계의 종류에는 어떠한 관계가 있는지 알아보고, 그 관계를 설정하기 위한 sequelize 함수에 대해 공부해보자.

(관계 설정은 모델 설정 파일인 models > index.js에서 작성하면 된다.)

 

 

 

Relationship - 1:1 관계

  • 한 테이블의 하나의 레코드가 다른 테이블의 하나의 레코드와 관련되어 있는 관계
  • 사용자와 프로필, 직원과 연차, 주문과 송장 등
  • 참조되는 모델의 PK가 참조하는 모델의 FK가 된다.
  • sequelize
    • 참조되는 모델.hasOne(참조하는 모델, {설정});: 한 모델이 다른 모델을 가리키는 1:1관계 설정
    • 참조하는 모델.belongsTo(참조되는 모델, {설정});: 다른 모델이 한 모델을 가리키는 1:1(N)관계 설정
    • 설정에는 보통 foreignKey, onUpdate, onDelete 설정이 들어감
    • 설정값 "CASCADE": 부모 테이블의 레코드에 수정/삭제가 일어날 경우, 자식 테이블의 레코드에도 수정/삭제-
    • ex) 사용자와 프로필
      • PlayerModel.hasOne(ProfileModel, {
          onUpdate: "CASCADE",
          onDelete: "CASCADE",
          foreignKey: "player_id",
        });
      • ProfileModel.belongsTo(PlayerModel, {
          onUpdate: "CASCADE",
          onDelete: "CASCADE",
          foreignKey: "player_id",
        });

 

 

 

 

Relationship - 1:N 관계 (일대다 관계)

  • 한 테이블의 레코드가 다른 테이블의 레코드 여러 개와 관련되어 있는 관계
  • 보통 부모 엔티티와 자식 엔티티 사이의 관계를 나타내는데 사용
  • 부서와 직원, 고객과 주문, 학교와 학생 등
  • sequelize
    • 참조되는 모델.hasMany(참조하는 모델, {설정});  한 모델이 다른 모델과 1:N관계를 가지는 설정
    • 참조하는 모델.belongsTo(참조되는 모델, {설정}); 다른 모델이 한 모델을 가리키는 1:1(N)관계 설정
    • ex) 팀과 팀원
    • TeamModel.hasMany(PlayerModel, {
        sourceKey: "team_id",
        foreignKey: "teamid",
      });
    • PlayerModel.belongsTo(TeamModel, {
        target: "team_id",
        foreignKey: "teamid",
      });

 

 

 

 

다대다 관계 예시

 

Relationship - N:M 관계 (다대다 관계)

  • 한 테이블의 레코드가 다른 테이블의 레코드 여러 개와 관련되고, 그 반대 테이블의 레코드도 다른 쪽 테이블의 레코드 여러 개와 관련되어 있는 관계
  • 중간 테이블을 사용하여 구현
  • 학생과 수업, 주문과 제품, 배우와 영화 등
  • sequelize
    • 한 쪽 모델.belongsToMany(다른 쪽 모델, {through: 중간 테이블명});: M:N관계를 설정
    • ex) 팀과 경기
    • TeamModel.belongsToMany(GameModel, {
        through: TeamGameModel,
        foreignKey: "team_id",
      });
    • GameModel.belongsToMany(TeamModel, {
        through: TeamGameModel,
        foreignKey: "game_id",
      });
    • 테이블 관계는 아래의 사진 참고

 

 

 

 

 


참고

https://velog.io/@eensungkim/ON-DELETE-CASCADE-feat.-row-%ED%95%9C-%EB%B2%88%EC%97%90-%EC%A7%80%EC%9A%B0%EB%8A%94-%EB%B0%A9%EB%B2%95-TIL-78%EC%9D%BC%EC%B0%A8