MySQL sequelize 관계정리

성민개발로그·2022년 1월 6일
0

데이터베이스

목록 보기
2/6

관계형 데이터베이스 는 말 그대로 관계를 잘 설정해줘야한다. MySQL 에서 관계를 어떻게 설정하는지 한번 알아보겠다.

포스트 모델로 예제로 설명을 하겠다.

module.exports = (sequelize, DataTypes ) => {
    const Post = sequelize.define('Post', {// MySQL 에는 'User' => users 로 테이블이 생성된다.
        //id가 기본적으로 들어있다.
        content:{
            type: DataTypes.TEXT,
            allowNull: false,
        },
        // UserId
    }, {
        charset: 'utf8mb4', // 이렇게 셋팅안하면 한글(이모지)넣을시 에라남.
        collate: 'utf8mb4_general_ci', //한글(이모지)저장
    });
    Post.associate = (db) => {
        db.Post.belongsTo(db.User);
        db.Post.belongsToMany(db.Hashtag, {through: 'PostHashtag'});
        db.Post.hasMany(db.Comment);
        db.Post.hasMany(db.Image);
        db.Post.belongsToMany(db.User, { through: 'Like', as: 'Likers'}); // 좋아요 누른 유저들
        db.Post.belongsTo(db.Post, {as: 'Retweet'});
    };
    return Post;
}

1. db.Post.belongsTo(db.User):

보통 User 가 여러개의 Post를 작성한다. 그리고 Post는 쓴사람이 User 한명이다 그래서 표현을 Post는User 에게 속한다 라고 표현할 수 있을꺼같다.
그래서 상호작용으로 작성을 해줘야하기 때문에 User 모델에서는 db.User.hasMany(db.Post) 이렇게 작성을해줘야한다.
Post 테이블에서 post 소유주인 UserId column이 하나 생깁니다.

2.db.Post.hasMany(db.Comment):

보통 하나의 Post는 많은 댓글을 달수가 있다. 그래서 표현을 Post는 많은(hasMany)Comment 를 가질수 있다고 할수있다. 반대로 comment 모델에서는 db.Comment.belongsTo(db.Post) 이렇게 작성해줘야한다.
Comment 테이블에서 comment 소유한 PostId column 이 생긴걸 알수가있다.

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

Post 게시글에는 해시태그가 있을수있다 그것도 여러개 예1) post1{content:'첫번째 포스트#감자#호박'} 예2) post2{content:'두번째 포스트#딸기#감자'} 이렇게 보면 post1 은 해시태그 감자,호박 이렇게 두개를 가지고, post2 는 해시태그 딸기,감자 이렇게 두개를 가지고있다. 반대로 감자라는 해시태그는 post1,post2 두개를 가지고있다. 이런 관계를 다대다 관계라고 한다
다대다 관계일때는 belongsToMany 를 사용한다 그리고 다대다 관계일땐 새로운 테이블 이름은 PostHashtag 인 테이블이 생성된다. 이름은 설정은 {through: 'PostHashtag'} 두번째 옵션 파라미터에 이렇게 작성해줘야한다.
이것도 똑같이 Hashtag 모델에서도 db.Hashtag.belongsToMany(db.Post, {through: 'PostHashtag'}) 이렇게 작성해줘야한다.
PostHashtag 테이블은 이런식으로 생성된다.

4.db.Post.belongsToMany(db.User, { through: 'Like', as: 'Likers'}):

Post 에는 많은 User들이 좋아요를 누를수가있다 반대로 User가 많은 Post에다가 좋아요를 누를수있다. 3번처럼 똑같이 테이블은 Like라는 테이블을 만들고 User이름을 Likers 라고 이름을 바꿀수가있다.

5.db.Post.belongsTo(db.Post, {as: 'Retweet'}):

트위터에는 리트윗이라는 트위터를 공유하는 기능이있다 이럴때는 같은모델 Post끼리 관계가 생긴다 공유한 Post는 하나는 여러번 공유당할수있지만 공유해서온 Post는 하나의 공유해온 Post에 속한다 그래서 만약 공유해온 Post면 공유한 Post를 Retweet 이렇게 표현할수 있다.

6*. 여기는 User모델에서 user들끼리 팔로잉과 팔로워 하는 관계일때 설명이다

    db.User.belongsToMany(db.User, { through: 'Follow', as: 'Follwer', foreignKey: 'FollowingId'});
    db.User.belongsToMany(db.User, { through: 'Follow', as: 'Following', foreignKey: 'FollowerId'});
};

유저는 유저들끼리 서로 팔로우하고 팔로잉당할수가 있다 그래서 유저들끼리 다대다관계를 그릴수있다.

{ through: 'Follow', as: 'Follwer', foreignKey: 'FollowingId'}
테이블이름은 Follow 라고 새로 생성되고 유저가 팔로워를 찾고싶을때 foreignKey: 'FollowingId' 먼저 FollowingId 아이디를 찾아서 팔로워를 찾으라는 의미다.

0개의 댓글