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

iiingkeep·2024년 12월 6일

Database

목록 보기
19/21

1. 저장할 데이터 파악

  • 닉네임, 이메일, 비밀번호, 프로필사진, 소개글, 팔로잉 대상

  • 게시글 작성자, 제목, 내용, 작성 날짜, 해시태그, 좋아요 수, 좋아요 누른 사람

  • 댓글 작성자, 댓글 내용, 작성 날짜, 어떤 게시글에 달렸는지

2. 그룹핑 및 분류

  • 사용자(users)
    닉네임, 이메일, 비밀번호, 프로필사진, 소개글, 팔로잉 대상

  • 게시글(posts)
    게시글 작성자, 제목, 내용, 작성 날짜, 해시태그, 좋아요 수

  • 댓글(comments)
    댓글 작성자, 댓글 내용, 작성 날짜

3. 테이블 생성 및 분리

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

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

users

id닉네임이메일비밀번호프로필 사진소개글팔로잉 대상
1김홍도k@k.comkkkkkhttp...안녕하세요2
2이지은n@n.comnnnnnhttp...안녕하세요1
3권지용h@h.comhhhhhhttp...안녕하세요1, 2

posts

id작성자제목내용작성 날짜해시태그좋아요 수좋아요 누른 사람
1김홍도취업에 관하여취업....2024-12-01 00:00:00개발자, 취업1권지용
2이지은개발자 역량 강화개발자....2024-12-01 00:00:00개발자, 스펙2김홍도, 권지용

comments

id작성자내용작성 날짜게시글
1김홍도좋은 글이네요2024-12-01 12:00:00개발자 역량 강화
2권지용잘 봤습니다2024-12-01 12:00:00취업에 관하여
2권지용잘 봤습니다2024-12-01 13:00:00개발자 역량 강화

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

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

users

id닉네임이메일비밀번호프로필 사진소개글
1김홍도k@k.comkkkkkhttp...안녕하세요
2이지은n@n.comnnnnnhttp...안녕하세요
3권지용h@h.comhhhhhhttp...안녕하세요

follows

id팔로워 id (FK)팔로잉 대상 id (FK)
112
221
331
432

posts

id작성자 id (FK)제목소제목내용작성 날짜
11취업에 관하여소제목취업....2024-12-01 00:00:00
22개발자 역량 강화소제목개발자....2024-12-01 00:00:00

hashtags

id해시태그명
1개발자
2취업
3스펙

posts_hashtags

id해시태그 id (FK)게시글 id (FK)
111
221
312
432

likes

id게시글 id (FK)사용자 id (FK)
113
221
323

comments

id작성자 id (FK)내용작성 날짜게시글 id (FK)
11좋은 글이네요2024-12-01 12:00:002
23잘 봤습니다2024-12-01 12:00:001
33잘 봤습니다2024-12-01 13:00:002

테이블 분리 및 생성의 과정

follows

  • 가장 고민 했던 부분으로, 팔로우한다는 자체가 사용자와 사용자간의 관계를 나타내는 데이터라고 생각했다.
    • 사용자 : 사용자 = N : M 관계로, follows 테이블만 새로 생성해 사용자 테이블에서 사용자 id를 모두 FK로 가져와 사용했다.

hashtags

  • 하나의 게시글은 여러개의 해시태그를 한 번에 가지며, 한 칸에 여러 데이터가 들어갈 수 있어 제 1 정규형 위반이다.
    • 게시글 : 해시태그 = N : M 이므로 해시태그가 나열된 테이블인 hashtags를 분리한 뒤 어떤 게시글에 어떤 해시태그가 달렸는지 알 수 있도록 데이터를 저장할 posts_hashtags 테이블을 새로 생성해 게시글 id와 해시테그 id를 FK로 가져왔다.

likes

  • 좋아요한 게시글과 좋아요를 누른 사용자가 반복해서 데이터가 쌓일 수 있으므로 게시글과 사용자는 진짜 중복이다.
    • 게시글 : 좋아요 = 1 : N 이므로 좋아요 테이블에 게시글 id를 FK로 둔다.
    • 사용자 : 좋아요 = 1 : N 이므로 좋아요 테이블에 사용자 id를 FK로 둔다.

posts

  • 작성자는 진짜 중복이므로 관계를 파악해 FK를 넣어준다.
    • 작성자 : 게시글 = 1 : N 이므로 posts 테이블에 작성자 id를 FK로 넣는다.
  • 한 게시글에 좋아요는 여러 사용자가 클릭할 수 있으므로 좋아요 누른 사람 컬럼은 한 칸에 여러 데이터가 들어가게 된다. 테이블을 분리해준다.
  • 좋아요 수는 likes의 데이터가 삽입, 삭제될 경우 이에 따라 변해야하는 통계 데이터이다. 컬럼을 삭제하고 이후에 쿼리를 통해 값을 구한다.

comments

  • 작성자와 게시글 컬럼은 진짜 중복이다. 관계를 통해 FK를 넣어준다.
    • 사용자 : 댓글 = 1 : N 이므로 comments 테이블에 사용자 id를 FK로 넣는다.
    • 게시글 : 댓글 = 1 : N 이므로 comments 테이블에 게시글 id를 FK로 넣는다.

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

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

users

id닉네임이메일비밀번호프로필 사진소개글
1김홍도k@k.comkkkkkhttp...안녕하세요
2이지은n@n.comnnnnnhttp...안녕하세요
3권지용h@h.comhhhhhhttp...안녕하세요

posts

id작성자 id (FK)제목소제목내용작성 날짜
11취업에 관하여소제목취업....2024-12-01 00:00:00
22개발자 역량 강화소제목개발자....2024-12-01 00:00:00

hashtags

id해시태그명
1개발자
2취업
3스펙

posts_hashtags

id해시태그 id (FK)게시글 id (FK)
111
221
312
432

follows

id팔로워 id (FK)팔로잉 대상 id (FK)
112
221
331
432

likes

id게시글 id (FK)사용자 id (FK)
113
221
323

comments

id작성자 id (FK)내용작성 날짜게시글 id (FK)
11좋은 글이네요2024-12-01 12:00:002
23잘 봤습니다2024-12-01 12:00:001
33잘 봤습니다2024-12-01 13:00:002

테이블 분리 및 생성의 과정

2번의 과정과 같다.

다만, 웹페이지 UI에 Popular Tags를 나타낸 부분이 있었는데 이를 표현하려면 가장 많이 사용된 상위 몇 개의 해시태그를 추릴 수 있어야 한다. 이 '해시태그 사용 횟수' 데이터를 저장할 데이터로 파악하지 못했다.
하지만 사용된 해시태그의 갯수를 컬럼으로 표현하는 것은 posts_hashtags 테이블에서 데이터가 삽입 또는 삭제될 경우 데이터가 바뀌는 통계 데이터이기 때문에 컬럼으로 넣지 않고 쿼리를 이용해 구한다.

글로 표현된 요구사항만 보다가 UI로 만들어진 모습을 직접 보고 DB 설계를 해봤는데, 글로 데이터를 표현해주지 않으니 내가 하나라도 놓치면 안되서 오히려 좀 더 꼼꼼히 봐야 한다는 생각이 들었다. 위의 Popular Tags 부분을 놓쳐보니 피부로 직접 느끼기도 했다.
그래도 정답에 가깝게 설계를 마친 것 같아 뿌듯하다.




** 요구사항 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개의 댓글