Skip to content

ERD 설계

nick edited this page Apr 22, 2024 · 6 revisions

drawSQL-image-export-2024-04-22

https://drawsql.app/teams/outstagram/diagrams/outstagram/embed

1. follow 관계 설계

  • 팔로우 관계 구현 시, (from_id + to_id)의 조합을 복합 키로하는 follow 테이블을 통해 구현

2. like 테이블과 bookmark 테이블 설계 시, 고민한 점

  • 현재 두 테이블의 column 구성은 동일하다.
  • 그래서 하나의 테이블로 합친 후 'type' column을 통해 해당 row가 like인지 bookmark인지 구분하려고 함
  • 하지만 현재는 두 테이블이 똑같을지 몰라도, 추후에 각 테이블에 column이 추가될 수 있으니 확장성을 위해 분리하는게 맞다고 판단

3. notification 테이블 설계 시, 고민한 점

1. target_id를 통해 게시물Id, 유저ID 저장하기

image
  • 초기에는 target_id column을 통해 게시물에 대한 알림인 경우 post_id를, 팔로우에 대한 알림인 경우 대상 user_id를 저장하려고 함
  • 이는 하나의 column이 2가지 역할을 담당하는 것임으로 단일 책임 원칙(SRP)를 어기는 상황이다

2. 2개의 column(post_id, user_id)를 통해 각 경우에 대한 id값 저장

image
  • SRP를 지키기 위해 하나의 column(target_id)에 2가지 역할을 부여하지 않고 post_id, user_id로 분리
  • 하지만 두 column 중 하나의 column은 무조건 null이다.
  • 이것 또한, 비정규화된 상태임으로 해결하기 위해 각 상태에 맞는 테이블로 분리하자

3. post_noti, follow_noti 2개의 table로 구분

image

  • 결국 2가지 테이블로 분리함을 통해 SRP 준수, 정규화 준수했다.

4. 하나의 notification table로 구성하는게 더 좋다

image

이유 2가지

  1. 알림 데이터를 가져오려면 결국 notification -> post_notification까지 조회해서 데이터를 가져와야 함 (notification에서 target의 type을 보고 post_noti or user_noti 테이블에서 데이터 가져올 수 있음. 즉, 쿼리를 2번 날려야 함
  2. 추후에 type이 추가된다면 테이블을 하나 또 생성해야 함