노드

노드 테이블 관계 이해하기

포칼이 2023. 4. 18. 11:39

관계 정의하기

users 모델과 comments 모델 간의 관계를 정의

  • 1 : N 관계 (사용자 한 명이 댓글 여러 개 작성)
  • 시퀄라이즈에서는 1 : N 관계를 hasMany로 표현(사용자.hasMany(댓글))
  • 반대의 입장에서는 belongsTo(댓글.belongsTo(사용자))
  • belongsTo가 있는 테이블에 컬럼이 생김(댓글 테이블에 commenter 컬럼)

*테이블, 시퀄라이저 관련 포스팅은 이번주 내로 정리할 예정

말로 표현해보면 좀 더 쉽다. 

사용자는 댓글을 여러개 작성할 수 있지만 댓글 하나에는 사용자 한명만이 존재해야 한다. 이런 경우가 1 대 다 관계 즉, 1 : N 관계라 할 수 있다. 

 

모델 각각의 static associate 메서드에 넣는다.

//models/user.js
...
static associate(db) {
    db.User.hasMany(db.Comment, { foreignKey: 'commenter', sourceKey: 'id' });
  }

 

영어를 해석하면서 하면 아주 직관적으로 이해가 된다. 사용자가 댓글을 많이 가진다 -> User.hasMany(db. Comment

그리고 외래키는 commenter이고 소스 키는 id가 된다. 

 

여기서 헷갈릴 수 있는데 User를 본인이라고 생각해보자.

sourceKey는 바로 User다. 즉, 본인이다.

foreignKey는 바로 Comment다. 즉, 나 말고 다른 사람이다. 

 

sourceKey는 User. sourceKey: 'id' 하면 나의 id라는 뜻이다.

 

외래키가 commenter라고 했는데 지금 User의 외래키가 commenter라는 것이 아니라 Comment가 commenter를 참조하고 있다~ 라는 뜻이다. 즉, Comment의 commenter라는 컬럼이 내 id를 참조하고 있다~ 라는 뜻이다. 

 

그럼 Comment에서도 관계가 생기겠다.

//models/comment.js
static associate(db) {
    db.Comment.belongsTo(db.User, { foreignKey: 'commenter', targetKey: 'id' });
  }

결과적으로는 user.js에서 했던 것과 반대로 하면 된다. 

댓글은 어떤 사용자에게 속해 있다 ->db.Comment.belongsTo(db.User

 

Comment가 본인이다.

User는 본인이 아닌 다른 사람이다.

 

여기서 belongsTo에서는 sourceKey가 아니라 targetKey를 사용한다. 

target은 나 말고 다른 사람이라고 생각하면 된다. 그래서 targetKey는 나 말고 다른 사람 즉, User가 된다.

 

foreignKey는 commenter라고 했는데 belongsTo에서는 관계에서의 belongsTo 즉, Comment가 된다(belongsTo가 있는 곳에 추가된다). 그래서 Comment에 comment 컴럼이 추가된다. 

 

1대 1 관계

예) 사용자 테이블과 사용자 정보 테이블

db.User.hasOne(db.Info, { foreignKey: 'UserId', sourceKey: 'id'});

db.Info.belongsTo(db.User, { foreignKey: 'UserId', targetKey: 'id'});

 

말 그대로 서로 하나만 대응되는 관계이다. hasOne 이라는 점을 조심하자.

뒤집어도 같은 관계가 형성되는 것을 1 : 1 관계라고 한다. 

두 개의 테이블에서 그럼 어떤 것이 hasOne인가 belongsTo인가를 정하는 것은 사용자 맘이다. 

 

다대다 관계

게시글과 해시태그 테이블을 예로 들 수 있다.

하나의 게시글이 여러 개의 해시태그를 가질 수 있고 하나의 해시태그가 여러 개의 게시글을 가질 수 있다. 

 

*DB 특성상 다대다 관계는 중간 테이블이 생긴다.

db.Post.belongsToMany(db.Hashtag, {through: 'PostHashtag});

db.Hashtag.belongsToMany(db.Post, {through: 'PostHashtag});

둘다 belongsTo라는 점을 조심하자. 그리고 중간 테이블이 생기기 때문에 through를 통해 중간 테이블을 써 주면 된다.

 

포스팅 순서가 엉망이 되어서 이해를 위해 시퀄라이즈 부분 링크를 남긴다.

https://kmryu807.tistory.com/102

 

노드 시퀄라이즈 사용하기

시퀄라이즈 ORM SQL 작업을 쉽게 할 수 있도록 도와주는 라이브러리 ORM : Object Relational Mapping : 객체와 데이터를 매핑(1 대 1 짝지음) MySQL 외에도 다른 RDB(Maria, Postgre, SQLite, MSSQL)와도 호환된다. 자바

kmryu807.tistory.com

https://kmryu807.tistory.com/108

 

노드 시퀄라이즈 모델 만들기

//models/user.js const Sequelize = require('sequelize'); class User extends Sequelize.Model { static initiate(sequelize) { User.init({ name: { type: Sequelize.STRING(20), allowNull: false, unique: true, }, age: { type: Sequelize.INTEGER.UNSIGNED, allowNull

kmryu807.tistory.com