Bletcher-Project/bletcher-back

Database schema를 Sequelize ORM으로 모델링하기

kimdg1105 opened this issue · 2 comments

Database Schema Diagram

DBschema
DBschema.pdf (참고 #10)

테이블 변경 사항

  • User 테이블의 user_id가 사용자의 별명을 의미하였는데, 이는 주 키 변수명과 중복되어 'nickname'으로 변경하였다.
  • User 테이블의 deleled_at과 unique 속성의 존재로, user 삭제 후 같은 이메일로 재가입이 안되는 문제가 발생하여 paranoid 기능을 제거하였다.
  • category 테이블을 제외한 다른 테이블의 후보키들에 not null 옵션을 추가하였다.
  • 속성 값(attribute)의 네이밍을 snake_case로 통일하였다.

Implement

: Sequelize ORM과 Typescript를 이용하여 모델화하였다. 공식 문서의 typescript 도큐먼트와 한글 번역본을 참고하며 설계했다. ORM을 처음 사용해보아서 미숙한 부분도 있지만 우선 우리의 스키마대로 모델링은 성공적으로 한 것 같다.
스크린샷 2020-08-04 오후 3 47 23

  • 모델별로 ts 파일을 분리하였고, 'loders/sequelize.ts'에서 모든 모델을 import하는 방식으로 구현하였다.

스크린샷 2020-08-04 오후 3 40 41

  • 'config/database.ts'에서 sequelize와 database 속성을 정의하였고 위와 같이 dialectOptions와 sequelize에 각각 timezone을 설정함으로서 시간 동기화 문제를 해결하였다.
  • charset: 'utf8mb4'를 설정하여 한글 데이터도 삽입이 가능하도록 하였다 (이모지도! 😄).

어려웠던 점과 해결법

  • 테이블간의 관계 파악이 어려웠다.
    : 일대일 관계는 비교적 쉽게 파악할 수 있었지만, N:M 관계의 경우, 두 모델 사이의 관계를 연결해주는 모델이 필요하다는 것을 알게 되었고, favorite, funding 모델이 이 관계를 연결해주는 모델로서 동작하도록 했다. 각각 '좋아요'와 '펀딩합니다'를 담당하는 모델이므로, through 옵션을 통해 맞는 테이블 이름을 설정 해주었다. 또한, user_id와 post_id가 합쳐져서 주키의 역할을 담당해야 했는데 이는 init시에 primaryKey 설정 없이 두 어트리뷰트를 설정하고 belongsToMany로 연결해줌으로서 해결하였다.

  • hasOne과 belongsTo의 차이점?
    : 차이점은 source 모델과 target 모델을 어디에 지정하느냐였다. 우리 스키마의 경우 belongsTo를 이용하여 관계 키를 source 모델에 삽입하였다. category 모델의 경우 자기 참조를 해야하므로 hasMany가 쓰였는데 이 부분은 차후 사용해보며 수정할 예정이다. (belongsToMany로 재귀 관계 정의가 되는 것 같다!)

  • as 옵션의 기능?
    : 기존에는 export 되는 class에 association을 설정하고 관계 설정에서 as로 묶어주었는데, 공식 문서와 검색을 통해 알아보니 as 옵션의 기능은 연결 관계에서 사용할 별칭을 설정하는 것임을 알게 되었고, 이미 테이블 명이 정해져 있는 우리의 스키마에서는 필요가 없다고 판단하여 association과 as 옵션을 삭제하였다. 이 부분도 차후 사용할 때 문제가 될 수 있으므로 인지하고 있으려고 한다.

  • 다른 테이블의 키를 주 키로 쓰는 모델 만들기
    : shopitem 모델의 경우 post 모델의 post_id가 shopitem의 주 키가 되도록 설계되어 있다. 이는 init 시 post_id: { type: DataTypes.INTEGER.UNSIGNED, primaryKey: true,}, 를 추가하고, Shopitem.belongsTo(Post, { foreignKey: 'post_id' });로 관계 설정을 함으로서 해결하였다.

참조


현재의 모델로 api를 제작할 예정이다. 즉, api 제작 중 문제가 생기면 몇 부분은 수정할 수도 있다는 것!

👍

우리가 생각하고 고민했었던 문제들이 다 정리되어있네유👍🏻 너무 수고했고 앞으로 api 제작 중 문제가 생기면 더 개선해봅시당 !!! 넘뿌듯왕뿌듯 ~! ~!!