유동

[DB] 데이터베이스 테이블 정규화하기 본문

database

[DB] 데이터베이스 테이블 정규화하기

동 선 2024. 6. 1. 15:10

기존 ERD를 수정하고 중복된 테이블을 개선하기

이번 글에서는 Clog 프로젝트의 기존 ERD(Entity-Relationship Diagram)를 개선하고, 중복된 테이블을 제거하며, enum 타입을 사용하는 방향으로 리팩토링하는 과정을 다루겠습니다.

목차

  1. 기존 ERD
  2. 기존 ERD의 문제점
  3. 개선된 ERD 설계
  4. enum 타입을 사용한 테이블 구조 개선
  5. 결론
  6. 기존 ERD

1. 기존 ERD

기존 erd

기존 데이터베이스 테이블 구조는 위 사진처럼 이루어져 있었습니다. 요구사항부터 말해보자면

  1. 동아리는 게시글과 댓글, 답글을 가질 수 있다.
  2. 게시글의 종류는 다음과 같다
    • 일반 게시글, 공지 게시글, 홍보 게시글
  3. 한 동아리에는 여러 게시판이 존재하고, 한 게시판 내에 여러 일반 게시글이 존재한다

당시 테이블 구조는 게시글의 종류마다 테이블을 각각 하나씩 가지고 있고, 그에대한 댓글, 답글 테이블도 각각 하나씩 가지고 있는것을 볼수 있습니다

해당 구조는 여러 가지 문제점을 가지고 있습니다.

  1. 중복된 테이블: club_board_post_tb, notice_post_tb, promotion_post_tb 세 개의 게시글 테이블이 존재하여 중복된 구조를 가지고 있습니다.
  2. 만약, 게시글에 새로운 기능이 추가된다면?
    1. 3가지 테이블에 모두 컬럼을 하나씩 만들어줘야 할겁니다. 댓글, 답글도 마찬가지이구요.
  3. 게시글의 타입을 나타내는 컬럼이 없어서, 게시글 타입을 구분하기 위해 테이블을 분리했습니다. 이는 데이터베이스 설계의 중복을 의미합니다
  4. 이는 데이터베이스 제 1정규화를 만족하지 못하는 테이블 설계입니다.
  5. 이는 곧 백엔드 api에도 영향을 끼치게 됩니다. 게시글을 구분할 방법이 없어 필연적으로 api가 다음과 같이 나뉠겁니다
    1. POST /post/general 일반 게시글 작성
    2. POST /post/notice 공지 게시글 작성
    3. POST /post/notice 홍보 게시글 작성
  6. 댓글, 답글도 마찬가지일겁니다ㅋㅋ api가 정말 난잡해질겁니다

개선된 ERD 설계

이제 기존 ERD를 개선하여 더 효율적이고 데이터베이스 정규화를 만족시키는 구조로 변경해보겠습니다.

게시글 테이블: 기존 club_post_tb, notice_post_tb, promotion_post_tb를 하나의 post_tb로 통합합니다. 게시글의 타입은 enum을 사용하여 구분합니다.
post_tb에는 게시글의 공통된 속성인 작성자, 제목, 본문, 생성 일, 수정 일이 존재합니다

  • 공지 게시글의 고정 게시글 여부 기능은 notice_post_tb 테이블을 만든 후, post_tb을 fk로 상속받아 설계하였습니다.
    댓글, 답글도 마찬기지입니다.

단순화된 관계: 테이블 간의 관계를 단순화하여 데이터베이스의 일관성을 유지할 수 있습니다.

결론

이번 글에서는 기존 프로젝트의 ERD를 개선하는 과정을 다뤘습니다. 중복된 테이블을 제거하고, enum 타입을 사용하여 게시글의 타입을 구분함으로써 데이터베이스 구조를 더 간결하고 관리하기 쉽게 만들었습니다