[DB 설계] 데이터베이스 모델링(Database Modeling) - 요구사항에 따른 DB 설계 실습:: 투두리스트

iiingkeep·2024년 12월 7일

Database

목록 보기
20/21

1. 저장할 데이터 파악

  • 닉네임, 비밀번호, 프로필 사진

  • 업무 내용, 세부내용, 날짜 및 시간, 우선순위, 완료유무, 남은 업무 개수, 완료된 업무 개수

  • 카테고리명, 아이콘, 색깔

  • 포커스 시간, 날짜

  • 앱 색깔, 앱 글꼴, 앱 언어

2. 그룹핑 및 분류

  • 사용자(users)
    닉네임, 비밀번호, 프로필 사진

  • 업무(tasks)
    업무 내용, 세부내용, 날짜 및 시간, 카테고리, 우선순위, 완료유무, 남은 업무 개수, 완료된 업무 개수

  • 카테고리(categories)
    카테고리명, 아이콘, 색깔

  • 포커스(focuses)
    포커스 시간, 날짜

  • 세팅(settings)
    앱 색상, 앱 글꼴, 앱 언어

3. 테이블 생성 및 분리

1) 데이터 분류에 따른 테이블 생성

먼저, 위에서 분류한대로 테이블을 생성한다. mock 데이터도 넣어본다.

users

id닉네임비밀번호프로필 사진
1iiingkeepkkkkkurl1
2dalpongnnnnnurl2

tasks

id내용세부내용날짜카테고리우선순위완료 유무남은 개수완료개수
1자바 공부2챕터2024-12-08 08:00:00공부1121
2달리기30분2024-12-08 19:00:00운동2021
3장보기양파2024-12-08 20:00:00집안일3021

categories

id카테고리명아이콘색깔
1공부아이콘1노랑
2운동아이콘2파랑
3집안일아이콘3초록

focuses

id시간날짜
11시간2024-12-07
21시간2024-12-07
32시간2024-12-08

app_colors

id색상명
1흰색
2검정색
3회색

app_typographies

id글꼴명
1궁서체
2굴림체
3돋움체

app_languages

id언어명
1한국어
2영어
3중국어

2) 테이블 분리 및 생성 (iiingkeep ver)

위에 생성된 테이블에서 중복 데이터를 찾아 테이블을 분리 및 생성한다.
내 임의로 진행한 과정이며 이유를 밑에 적어놓았다.
이 과정으로 수정되거나 생성된 테이블은 아래와 같다.

tasks

id내용세부내용날짜카테고리 id (FK)우선순위완료 유무
1자바 공부2챕터2024-12-08 08:00:00111
2달리기30분2024-12-08 19:00:00220
3장보기양파2024-12-08 20:00:00330

tasks

  • 진짜 중복
    • 카테고리
      동일한 카테고리에 속한 업무를 여러 개 등록할 수 있으므로 중복된 카테고리 데이터가 나올 수 있다.
      업무 : 카테고리 = N : 1 이므로 tasks 테이블에 카테고리 id를 FK로 넣어준다.
    • 완료 개수
      완료한 개수를 모든 행에 기재해야 하므로 진짜 중복이며, 완료 유무 컬럼에서 완료한 데이터를 모두 합한 합계 데이터이다. 그러므로 테이블에서 제외하고 이후에 쿼리문으로 구하도록 한다.
    • 남은 개수
      남은 개수를 모든 행에 기재해야 하므로 진짜 중복이며, 완료 유무 컬럼에서 완료하지 않은 데이터를 모두 합한 합계 데이터이다. 그러므로 테이블에서 제외하고 이후에 쿼리문으로 구하도록 한다.

3) 최종적으로 설계된 DB (강사님 ver)

강사님이 설계한 최종 버전 DB이다.
위에서 내가 진행한 과정과 강사님이 진행한 과정을 비교하며 내가 다르게 설계한 이유도 함께 기재했다.

users

id닉네임비밀번호프로필 사진
1iiingkeepkkkkkurl1
2dalpongnnnnnurl2

tasks

id내용세부내용마감 시간카테고리 id (FK)우선순위완료 유무사용자 id
1자바 공부2챕터2024-12-08 08:00:0011TRUE1
2달리기30분2024-12-08 19:00:0022FALSE1
3장보기양파2024-12-08 20:00:0033FALSE1

categories

id카테고리명아이콘색깔
1공부아이콘11
2운동아이콘21
3집안일아이콘32

categories_colors

id색상
1빨강
2노랑
3파랑

focus_histories

id시간 (단위: 분)날짜사용자 id
1602024-12-07 12:00:001
2602024-12-07 14:00:001
31202024-12-08 12:00:001

테이블 분리 및 생성의 과정

tasks

  • 어떤 사용자가 등록한 업무인지 사용자 컬럼도 넣어줘야 한다.
  • 날짜 데이터에 대한 컬럼 이름을 단순히 '날짜'로 했는데, 투두리스트의 특성상 '마감 시간' 이라는 표현이 훨씬 직관적이었다.

categories_colors

  • 카테고리 종류가 매우 제한적이고 중복이 있다고 해도 아주 소수일거라고 생각해 카테고리 색상을 한 테이블에 담았는데 강사님은 일단 정석적으로는 원래 분리를 해야 하는 것이라고 테이블을 분리하셨다. 하지만 이후에 역정규화를 통해 한 테이블로 통합하긴 한다고 하셨다.

focus_histories

  • 단순하게 생각하고 넘어 갔던 시간 부분!
    데이터베이스에 알아서 '1시간' 이라는 문자로 저장될리가 없는데, 실수를 했다. 단위를 지정해서(초, 분, 시간) 컬럼을 만들어야 한다.
  • 이 기능을 어떤 사용자가 얼마나 이용했는지 알아야 이후에 그 사용자에 대한 통계를 낼 수 있으므로 사용자에 대한 컬럼도 있어야 한다.

app

  • UI에 앱 세팅 메뉴로 색상, 글꼴, 언어가 있어서 이 데이터도 데이터베이스에 저장했는데, 강사님은 이 부분을 저장하지 않고 넘어가셨다.
    자주 바뀌는 데이터라면 데이터베이스에 저장하는 게 좋지만, 그렇지 않은 경우라면 프론트단에서 띄워주는 방법도 있기 때문이다. 서비스의 특성에 따라 선택하면 될 것이다.




** 요구사항 UI의 경우 강의 자료를 그대로 가져와야해서 생략했습니다.



참고

이 게시글은 박재성님의 비전공자도 이해할 수 있는 DB 설계 입문/실전 강의를 토대로 작성되었습니다.
https://www.inflearn.com/course/%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90-db-%EC%84%A4%EA%B3%84-%EC%9E%85%EB%AC%B8/dashboard

profile
혁신적인 백엔드 개발자가 되고자, 기록✏️

0개의 댓글