Post

ERD 다이어그램 구현 프로젝트

    1) 프로젝트 개요

    • K-pop 아티스트와 팬을 이어주는 가상의 글로벌 조공 플랫폼 ‘Fandom K’은 현재 서비스의 와이어프레임만 작성된 상태이며, Fandom-K의 데이터 인프라를 담당하는 데이터 엔지니어로써 해당 서비스의 DB를 구축하는 작업을 맡게되었다.
      • 와이어프레임이란 프로젝트 또는 기술의 기본 프레임워크를 요약하는 시각적 다이어그램을 말하며, 실무에서는 주로 figma를 통해 작업한다.

    2) 프로젝트 목표

    1. 와이어프레임을 참고하여 서비스 전체의 ERD 다이어그램을 작성한다. 어떤 테이블이 필요한지, 테이블간의 관계(식별/비식별 관계, 카디널리티, 컬럼의 PK와 FK 등)와 테이블 정규화를 고려하며 작성한다.
    2. 작성한 ERD 다이어그램을 기반으로 MySQL 또는 빅쿼리에 구현해본다. ‘Fandom-K’라는 데이터베이스를 하나 생성하고, DDL문 작성을 통해 실제 DB 환경을 구현해본다. (테이블 내 데이터는 따로 구현하지 않고 생략한다)

    3) ‘Fandom-K’ 서비스 파악

    1. 서비스 개요
      • K-pop 아티스트와 팬을 이어주는 글로벌 조공 플랫폼
      • PC, 태블릿, 모바일 등 크로스플랫폼 지원
    2. 후원하기 페이지 (메인페이지)

      image.png

      2-1. 페이지 구조

      • 상단 우측에 개인프로필 이미지 클릭시 ‘마이페이지’로 이동
      • 상단 중앙에 유저 개인의 보유 크레딧과 ‘충전하기’ 버튼 제공
      • ‘충전하기’버튼 클릭시 ‘충전하기 모달창’이 나타남
      • 중앙에 ‘후원을 기다리는 조공’으로 조공 별 후원하기 버튼, 아티스트 이미지, 조공내용, 후원된 크레딧, 남은 조공 기간 제공
        • 예시) 르세라핌 채원 지하철 광고, 현재 6000크레딧 조공됨, 5일 남음
      • ‘후원하기’버튼 클릭시 해당 아이돌을 후원하는 ‘후원하기 모달창’이 나타남
      • 하단에 ‘이달의 차트’로 차트 별 ‘차트 투표하기’ 버튼과 순위 제공
      • ‘차트 투표하기’버튼 클릭시 ‘투표하기 모달창’이 나타남
      • 이달의 차트 별 탭을 클릭시 투표가 많은 순으로 결과를 보여줌
        • 예시) 이달의 여자 아이돌 차트 현재 1위 뉴진스 민지 200,000표

      2-2. 페이지 설명

      • 크레딧은 Fandom-K에서 사용하는 가상 화폐를 말함
      • 소유하고 있는 크레딧을 내가 원하는 조공에 후원할 수 있음
      • 후원할 크레딧은 내가 보유하고 있는 크레딧 내에서 자유롭게 결정할 수 있음
      • 여러 유저의 후원을 통해 크레딧 목표치가 달성되면 조공이 이루어짐
    3. 마이페이지

      image.png

      • 마이페이지에서 내가 좋아하는 아티스트들을 팔로우 할 수 있음
      • 팔로우한 아티스트의 여러 소식들을 메인페이지에서 확인할 수 있음
      • 관심 있는 아이돌로 추가하고 싶은 아이돌카드(아이돌 이름, 그룹명, 이미지)를 중복으로 선택할 수 있음
      • 선택된 카드는 체크표시가 됨
      • ‘추가하기’ 버튼을 누르면 선택된 카드들이 ‘내가 관심 있는 아이돌’에 추가됨
      • ‘내가 관심 있는 아이돌’ 카드의 ‘X’버튼을 누르면 관심있는 아이돌에서 제외됨
    4. 충전하기 모달창

      image.png

      4-1. 모달창 설명

      • 충전할 금액을 선택후 ‘충전하기’ 버튼을 누르면 내 크레딧이 충전됨

      4-2. 페이지 설명

      • 크레딧을 원하는 만큼 충전할 수 있음
      • Fandom-K의 주요 매출은 크레딧 판매 수수료임
    5. 후원하기 모달창

      image.png

      • 내 크레딧 보다 적은 크레딧을 입력했을때 ‘후원하기’ 버튼이 활성화됨
      • 활성화된 ‘후원하기’버튼 클릭시 조공 완료됨
      • 후원한 만큼 내 크레딧이 줄어듬
    6. 투표하기 모달창

      image.png

      6-1. 모달창 설명

      • ‘후원하기’페이지에서 특정 이달의 차트의 ‘차트 투표하기’버튼 선택시 나오는 모달창
      • 해당 차트에서 투표하고싶은 대상을 선택해서 ‘투표하기’ 버튼 클릭
      • 투표하기 진행시 1000 크레딧이 소모됨

      6-2. 페이지 설명

      • 카테고리 별로 내가 원하는 아티스트에게 투표할 수 있음
      • 한 번 투표하는데 일정 크레딧이 소모됨
      • 한 유저가 여러 아티스트에게 투표할 수 있고, 투표 횟수도 무제한 가능함

    4) 프로젝트 구현

    서비스 주요 기능 정리

    1. 유저(팬)
      • 가입 시: 닉네임, 이메일, 프로필 사진 등록
      • 보유 크레딧이 존재 (충전 가능, 후원/투표 시 차감)
    2. 아티스트
      • 아티스트 등록: 이름, 프로필사진, 그룹명 등
      • 그룹명은 한 명의 아티스트가 하나의 그룹에만 속한다고 가정
    3. 후원
      • 여러 유저가 특정 조공 프로젝트(예: “르세라핌 채원 지하철 광고”)에 크레딧을 후원
      • 목표 달성, 남은 기간(종료일) 등을 표시
      • 후원 시 크레딧 감소
    4. 차트(투표)
      • 카테고리별(예: 이달의 여자 아이돌 차트, 남자 아이돌 차트 등)로 투표
      • 투표 1회당 1000크레딧 소모
      • 투표 횟수 무제한, 여러 아티스트에게 투표 가능
    5. 크레딧 충전
      • 원하는 금액 충전 시, 보유 크레딧 증가
    6. 마이페이지
      • 관심 있는 아이돌(아티스트)을 팔로우
      • 팔로우한 아티스트의 소식들을 메인페이지에서 확인
      • 팔로우/언팔로우 기능

    주요 테이블 및 관계 설정

    1. 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)
          • 한 유저가 여러 크레딧 트랜잭션을 기록할 수 있음
    2. artists
      • 아티스트 정보 저장
      • PK: artist_id
      • 컬럼: 이름, 그룹명, 프로필사진 등
      • 관계
        • artists (1) : user_follows (N)
          • 유저 여러 명이 한 아티스트를 팔로우할 수 있음
        • artists (1) : donations (N)
          • 한 아티스트에게 후원 프로젝트가 여러 개 열릴 수 있음
        • artists (1) : chart_votes (N)
          • 한 아티스트가 여러 표(chart_votes)를 받을 수 있음
    3. user_follows
      • 유저와 아티스트 간의 팔로우 관계 테이블 (N:M 관계)
      • PK: ( user_id, artist_id ) 복합키
      • 컬럼: 팔로우 일시 등
      • 관계
        • user_id → FK → users.user_id
        • artist_id → FK → artists.artist_id
        • users (M) ↔ user_follows (N) ↔ artists (M)
    4. donations
      • 조공(후원) 프로젝트 정보 저장 (예: “르세라핌 채원 지하철 광고”)
      • PK: donation_id
      • 컬럼: 프로젝트명(후원 제목), 대상 아티스트, 목표 크레딧, 종료일, 현재 모인 총 크레딧 등
      • 관계
        • artists (1) : donations (N)
          • donations.artist_id → FK → artists.artist_id
        • donations (1) : donation_contributions (N)
          • 여러 유저가 하나의 Donation에 기여(contribution)할 수 있음
    5. 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
    6. charts
      • 투표 차트 정보 테이블
      • PK: chart_id
      • 컬럼: 차트 이름(예: “이달의 여자 아이돌 차트”), 카테고리(“여자 아이돌”/“남자 아이돌” 등), 유효 기간(해당 달) 등
      • 관계
        • charts (1) : chart_votes (N)
          • 하나의 차트에 대해 여러 투표 레코드가 있을 수 있음
    7. 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)
          • 한 아티스트가 여러 표(투표)를 받을 수 있음
    8. credit_transactions
      • 유저의 크레딧 변동 내역 기록
      • PK: transaction_id
      • 컬럼: user_id, 거래 유형(“충전”, “후원”, “투표”), 변경 크레딧, 거래 일시 등
      • 관계
        • users (1) : credit_transactions (N)
          • 한 유저가 여러 크레딧 트랜잭션(충전/후원/투표 이력)을 남길 수 있음

    ERD 다이어그램 작성

    erd_dbdiagram.png

    mysql에서 ERD 다이어그램 구현

    erd_mysql.png

    This post is licensed under CC BY 4.0 by the author.