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

이번 포스팅에서는, 지난 포스팅에서 공부했었던 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",});
- 테이블 관계는 아래의 사진 참고

참고