ERD 다이어그램 구현 프로젝트
1) 프로젝트 개요
- K-pop 아티스트와 팬을 이어주는 가상의 글로벌 조공 플랫폼 ‘Fandom K’은 현재 서비스의 와이어프레임만 작성된 상태이며, Fandom-K의 데이터 인프라를 담당하는 데이터 엔지니어로써 해당 서비스의 DB를 구축하는 작업을 맡게되었다.
- 와이어프레임이란 프로젝트 또는 기술의 기본 프레임워크를 요약하는 시각적 다이어그램을 말하며, 실무에서는 주로 figma를 통해 작업한다.
2) 프로젝트 목표
- 와이어프레임을 참고하여 서비스 전체의 ERD 다이어그램을 작성한다. 어떤 테이블이 필요한지, 테이블간의 관계(식별/비식별 관계, 카디널리티, 컬럼의 PK와 FK 등)와 테이블 정규화를 고려하며 작성한다.
- 작성한 ERD 다이어그램을 기반으로 MySQL 또는 빅쿼리에 구현해본다. ‘Fandom-K’라는 데이터베이스를 하나 생성하고, DDL문 작성을 통해 실제 DB 환경을 구현해본다. (테이블 내 데이터는 따로 구현하지 않고 생략한다)
3) ‘Fandom-K’ 서비스 파악
- 서비스 개요
- K-pop 아티스트와 팬을 이어주는 글로벌 조공 플랫폼
- PC, 태블릿, 모바일 등 크로스플랫폼 지원
후원하기 페이지 (메인페이지)
2-1. 페이지 구조
- 상단 우측에 개인프로필 이미지 클릭시 ‘마이페이지’로 이동
- 상단 중앙에 유저 개인의 보유 크레딧과 ‘충전하기’ 버튼 제공
- ‘충전하기’버튼 클릭시 ‘충전하기 모달창’이 나타남
- 중앙에 ‘후원을 기다리는 조공’으로 조공 별 후원하기 버튼, 아티스트 이미지, 조공내용, 후원된 크레딧, 남은 조공 기간 제공
- 예시) 르세라핌 채원 지하철 광고, 현재 6000크레딧 조공됨, 5일 남음
- ‘후원하기’버튼 클릭시 해당 아이돌을 후원하는 ‘후원하기 모달창’이 나타남
- 하단에 ‘이달의 차트’로 차트 별 ‘차트 투표하기’ 버튼과 순위 제공
- ‘차트 투표하기’버튼 클릭시 ‘투표하기 모달창’이 나타남
- 이달의 차트 별 탭을 클릭시 투표가 많은 순으로 결과를 보여줌
- 예시) 이달의 여자 아이돌 차트 현재 1위 뉴진스 민지 200,000표
2-2. 페이지 설명
- 크레딧은 Fandom-K에서 사용하는 가상 화폐를 말함
- 소유하고 있는 크레딧을 내가 원하는 조공에 후원할 수 있음
- 후원할 크레딧은 내가 보유하고 있는 크레딧 내에서 자유롭게 결정할 수 있음
- 여러 유저의 후원을 통해 크레딧 목표치가 달성되면 조공이 이루어짐
마이페이지
- 마이페이지에서 내가 좋아하는 아티스트들을 팔로우 할 수 있음
- 팔로우한 아티스트의 여러 소식들을 메인페이지에서 확인할 수 있음
- 관심 있는 아이돌로 추가하고 싶은 아이돌카드(아이돌 이름, 그룹명, 이미지)를 중복으로 선택할 수 있음
- 선택된 카드는 체크표시가 됨
- ‘추가하기’ 버튼을 누르면 선택된 카드들이 ‘내가 관심 있는 아이돌’에 추가됨
- ‘내가 관심 있는 아이돌’ 카드의 ‘X’버튼을 누르면 관심있는 아이돌에서 제외됨
충전하기 모달창
4-1. 모달창 설명
- 충전할 금액을 선택후 ‘충전하기’ 버튼을 누르면 내 크레딧이 충전됨
4-2. 페이지 설명
- 크레딧을 원하는 만큼 충전할 수 있음
- Fandom-K의 주요 매출은 크레딧 판매 수수료임
후원하기 모달창
- 내 크레딧 보다 적은 크레딧을 입력했을때 ‘후원하기’ 버튼이 활성화됨
- 활성화된 ‘후원하기’버튼 클릭시 조공 완료됨
- 후원한 만큼 내 크레딧이 줄어듬
투표하기 모달창
6-1. 모달창 설명
- ‘후원하기’페이지에서 특정 이달의 차트의 ‘차트 투표하기’버튼 선택시 나오는 모달창
- 해당 차트에서 투표하고싶은 대상을 선택해서 ‘투표하기’ 버튼 클릭
- 투표하기 진행시 1000 크레딧이 소모됨
6-2. 페이지 설명
- 카테고리 별로 내가 원하는 아티스트에게 투표할 수 있음
- 한 번 투표하는데 일정 크레딧이 소모됨
- 한 유저가 여러 아티스트에게 투표할 수 있고, 투표 횟수도 무제한 가능함
4) 프로젝트 구현
서비스 주요 기능 정리
- 유저(팬)
- 가입 시: 닉네임, 이메일, 프로필 사진 등록
- 보유 크레딧이 존재 (충전 가능, 후원/투표 시 차감)
- 아티스트
- 아티스트 등록: 이름, 프로필사진, 그룹명 등
- 그룹명은 한 명의 아티스트가 하나의 그룹에만 속한다고 가정
- 후원
- 여러 유저가 특정 조공 프로젝트(예: “르세라핌 채원 지하철 광고”)에 크레딧을 후원
- 목표 달성, 남은 기간(종료일) 등을 표시
- 후원 시 크레딧 감소
- 차트(투표)
- 카테고리별(예: 이달의 여자 아이돌 차트, 남자 아이돌 차트 등)로 투표
- 투표 1회당 1000크레딧 소모
- 투표 횟수 무제한, 여러 아티스트에게 투표 가능
- 크레딧 충전
- 원하는 금액 충전 시, 보유 크레딧 증가
- 마이페이지
- 관심 있는 아이돌(아티스트)을 팔로우
- 팔로우한 아티스트의 소식들을 메인페이지에서 확인
- 팔로우/언팔로우 기능
주요 테이블 및 관계 설정
- users
- 서비스에 가입한 유저(팬) 정보 저장
- PK:
user_id
- 컬럼: 닉네임, 이메일, 프로필사진, 보유 크레딧 등
- 관계
- users (1) : user_follows (N)
- 유저-아티스트 M:N 관계를 중간테이블(user_follows)로 풀었기 때문에, users 입장에서는 1:N
- users (1) : donation_contributions (N)
- 한 유저가 여러 후원 내역(donation_contributions)을 남길 수 있음
- users (1) : chart_votes (N)
- 한 유저가 여러 차트 투표(chart_votes)를 할 수 있음
- users (1) : credit_transactions (N)
- 한 유저가 여러 크레딧 트랜잭션을 기록할 수 있음
- users (1) : user_follows (N)
- artists
- 아티스트 정보 저장
- PK:
artist_id
- 컬럼: 이름, 그룹명, 프로필사진 등
- 관계
- artists (1) : user_follows (N)
- 유저 여러 명이 한 아티스트를 팔로우할 수 있음
- artists (1) : donations (N)
- 한 아티스트에게 후원 프로젝트가 여러 개 열릴 수 있음
- artists (1) : chart_votes (N)
- 한 아티스트가 여러 표(chart_votes)를 받을 수 있음
- artists (1) : user_follows (N)
- user_follows
- 유저와 아티스트 간의 팔로우 관계 테이블 (N:M 관계)
- PK: (
user_id
,artist_id
) 복합키 - 컬럼: 팔로우 일시 등
- 관계
user_id
→ FK → users.user_idartist_id
→ FK → artists.artist_id- users (M) ↔ user_follows (N) ↔ artists (M)
- donations
- 조공(후원) 프로젝트 정보 저장 (예: “르세라핌 채원 지하철 광고”)
- PK:
donation_id
- 컬럼: 프로젝트명(후원 제목), 대상 아티스트, 목표 크레딧, 종료일, 현재 모인 총 크레딧 등
- 관계
- artists (1) : donations (N)
donations.artist_id
→ FK →artists.artist_id
- donations (1) : donation_contributions (N)
- 여러 유저가 하나의 Donation에 기여(contribution)할 수 있음
- artists (1) : donations (N)
- donation_contributions
- 유저가 특정 조공 프로젝트에 조공(후원)한 내역 (N:M 관계)
- PK:
donation_contribution_id
(Auto Increment) - FK:
user_id
,donation_id
- 컬럼: 후원 크레딧, 후원 일시
- 관계
- users (1) : donation_contributions (N)
- 한 유저가 여러 번 후원할 수 있음
- donations (1) : donation_contributions (N)
- 한 Donation에 여러 유저가 기여 가능
- 종합적으로 users ↔ donations = M:N
- users (1) : donation_contributions (N)
- charts
- 투표 차트 정보 테이블
- PK:
chart_id
- 컬럼: 차트 이름(예: “이달의 여자 아이돌 차트”), 카테고리(“여자 아이돌”/“남자 아이돌” 등), 유효 기간(해당 달) 등
- 관계
- charts (1) : chart_votes (N)
- 하나의 차트에 대해 여러 투표 레코드가 있을 수 있음
- charts (1) : chart_votes (N)
- chart_votes
- 유저가 특정 차트에 아티스트 투표한 정보 (유저가 어느 아티스트에게 투표했는지)
- PK:
chart_vote_id
- FK:
user_id
,artist_id
,chart_id
- 컬럼: 투표 일시, 차트별로 몇 표가 들어갔는지 기록(1회 투표 시 1표 혹은 1000크레딧으로 표기 등)
- 관계
- charts (1) : chart_votes (N)
- 하나의 차트 내에서 여러 투표가 발생
- users (1) : chart_votes (N)
- 한 유저가 여러 차트 투표 레코드를 가질 수 있음
- artists (1) : chart_votes (N)
- 한 아티스트가 여러 표(투표)를 받을 수 있음
- charts (1) : chart_votes (N)
- credit_transactions
- 유저의 크레딧 변동 내역 기록
- PK:
transaction_id
- 컬럼:
user_id
, 거래 유형(“충전”, “후원”, “투표”), 변경 크레딧, 거래 일시 등 - 관계
- users (1) : credit_transactions (N)
- 한 유저가 여러 크레딧 트랜잭션(충전/후원/투표 이력)을 남길 수 있음
- users (1) : credit_transactions (N)
ERD 다이어그램 작성
mysql에서 ERD 다이어그램 구현
This post is licensed under CC BY 4.0 by the author.