노드 테이블 관계 이해하기
관계 정의하기
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