Project/codestates-first-project

6일차 / 테이블간의 관계 설정

fullfish 2022. 4. 13. 00:05

진행

테이블간의 관계설정

관계설정하는 이유는 테이블간의 무결성을 유지하기위해(좀 더 연관성있게 ex)부모 테이블 삭제시 자식 테이블도 삭제)

 

관계설정 방법에는 2가지가 있는데

마이그레이션과 모델 파일 모두 수정하는 방법과 //내가 함

마이그레이션을 하지않고 모델만을 사용하는 방법이 있다 //팀장님이 함

 

내가한 방법만 기술할것이고 다른 방법은 나중에 기술.

예를 들어 user가 여러개의 trip을 간다면 1:N 형태이다

그렇다면 trip table에 user_id가 외래키로 존재해야한다

 

1:N 세팅하는 법

일반적인 모델만드는

 npx sequelize-cli model:generate --name User --attributes name:string

이거는 마이그레이션 파일과 모델 파일 모두 생성되는데 이거 말고

 npx sequelize-cli migration:generate --name fk-trip

처럼해주면 마이그레이션만 생성되는데 

해당 마이그레이션에 user와 trip의 관계의 경우

"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.addColumn("trip", "user_id", {
      type: Sequelize.INTEGER,
      allowNull: true,
      references: {
        model: "user", // user 모델에서
        key: "id", // 그 아이디 값을 참고합니다.
      },
      onUpdate: "CASCADE",
      onDelete: "CASCADE", //부모 삭제시 자식도 삭제해주는 옵션
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn(
      "trip", // name of Source model
      "user_id" // key we want to remove
    );
  },
};

처럼 작성해준다 diary table에 user_id컬럼을 추가해준다. (중요 : diary에 마이그레이션시 직접 user_id를 생성해주는것이 아님)

그리고 models/index.js에 

db.user.hasMany(db.trip, { foreignKey: "user_id", sourceKey: "id" });
db.trip.belongsTo(db.user, { foreignKey: "user_id", targetKey: "id"});

처럼 관계를 설정해준다

부모 테이블인 user는 hasMany
자식 테이블인 trip은 belongsTo
N:M관계에서는 belongsToMany설정을 해준다

이러면 1:N 관계 설정은 끝났고

 

N:M의 경우에는 

마찬가지로 마이그레이션을 만들어 주고 위의코드처럼 up과 down을 작성해주는데 join table이니까

두개씩 써준다

예시

"use strict";

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.addColumn("diary_hashtag", "diary_id", {
      type: Sequelize.INTEGER,
      allowNull: true,
      references: {
        model: "diary", 
        key: "id", 
      },
      onUpdate: "CASCADE",
      onDelete: "CASCADE",
    });
    await queryInterface.addColumn("diary_hashtag", "hashtag_id", {
      type: Sequelize.INTEGER,
      allowNull: true,
      references: {
        model: "hashtag", 
        key: "id", 
      },
      onUpdate: "CASCADE",
      onDelete: "CASCADE",
    });
  },

  down: async (queryInterface, Sequelize) => {
    await queryInterface.removeColumn(
      "diary_hashtag", // name of Source model
      "diary_id" // key we want to remove
    );
    await queryInterface.removeColumn(
      "diary_hashtag", // name of Source model
      "hashtag_id" // key we want to remove
    );
  },
};

그리고 models/index.js에는 

db.diary.belongsToMany(db.hashtag, {
  through: "diary-hashtag",
  foreignKey: "diary_id",
  sourceKey: "id",
});
db.hashtag.belongsToMany(db.diary, {
  through: "diary-hashtag",
  foreignKey: "hashtag_id",
  sourceKey: "id",  
});

를 써줘서 관계설정을 마무리해준다

'Project > codestates-first-project' 카테고리의 다른 글

8~9 일차 / 마무리  (0) 2022.04.19
7일차 / AWS이용한 환경변수 설정  (0) 2022.04.13
5일차 / MVC 모델  (0) 2022.04.09
4일차 / HTTPS인증과 도메인구입 (route53)  (0) 2022.04.08
3일차 / 보완한 SR  (0) 2022.04.08