[부트캠프][3주차]배달의 민족 ERD 설계

이호석·2022년 6월 22일
3

부트캠프

목록 보기
9/11

배달의 민족 ERD 설계 연습을 하려고 한다.
모든 DB를 따라하는 것은 불가능하기에 간결하면서 중요도가 높은 것만 설계할 필요성을 느꼈다. 배달의 민족은 배달, 배민1, 포장 말고도 쇼핑라이브, 선물하기, 전국별미, B마트 등 여러 서비스를 제공한다. 하지만 나는 위에서 말한 세가지들로만 설계했다.

ERD 설계

  • ERD 설계 Tool은 erdcloud를 선택했다. 무료이기도 하고 전에 사용해본 경험이 있기 때문이다. 단점으로는 클릭한 테이블을 제외한 나머지는 포커스아웃 현상이 일어난다. 개인적으로 매우 불편한 기능이다.
  • 테이블 컬럼 설명은 컬럼명 및 논리 이름으로 유추할 수 있는 것은 생략할 것이다. (ex 휴대폰 번호, 이메일 등)
  • 모든 테이블에 일반적으로 생성일, 수정일, 상태가 있다. 설계 수업에서 기업의 데이터들은 삭제할 때, 실제로 삭제하는 것이 아니라 상태를 '삭제'로 변경해줌으로써, 데이터를 처리한다고 한다.

분홍색 선 : 비식별 관계, 하늘색 선 : 식별 관계
전체 페이지 - 배달의 민족 ERD(개발중 수정으로 다소 바꼈다..)
전체적으로 회원과 가게 두 진영으로 나눌 수 있고 그 사이에 주문이 있다.
회원 : 회원, 쿠폰, 회원주소, 주문, 찜
가게 : 가게, 메뉴, 메뉴 옵션, 리뷰, 주문, 찜

회원

user_id : AUTO_INCREMENT, PK이다.
grade : 배달의 민족은 전월 주문 횟수에 따라 회원 등급이 결정된다. 기본은 '고마운분'이다.
role : 회원, 사장으로 구분한다.
현재주소 : 주소 테이블이 따로 있지만, 회원이 주문을 할려면 기본 주소를 정해야 한다.
생성일 : 데이터가 생성된 시간이다.
수정일 : 데이터가 수정된 시간이다. 생성당시 수정 시간도 입력된다.
상태 : 기본적인 상태인 일반, 휴먼, 탈퇴, 벤(정지) 말고도 배달의 민족은 리뷰 금지 등 다양한 상태가 있는것 같다.
아래 테이블부터 PK, 생성일, 수정일 설명은 생략된다.

주소

회원 : 주소 = 1 : N
회원은 여러개의 주소를 등록할 수 있다. 실제 주소 db는 복잡하겠지만 여기서는 단순하게 설계했다.

쿠폰

회원 : 쿠폰 = 1 : N
쿠폰은 회원에 종속되지 않는다.

회원은 여러 가게를 선택해서 찜을 할 수 있다. 가게는 찜의 총 숫자를 확인할 수 있다.
주문은 가게, 메뉴 이후에 설명하겠다.


가게

type : 가게는 기본인 '배달', 한 번에 한 집만 빠르게 배달하는 '배민1', '포장'을 복수개 선택해서 운영할 수 있다. 기본 값 0인 상태에서 배달이 가능하면 +1, 배민1이 가능하면 +2, 포장이 가능하면 +4를 하고 최종값을 비트논리연산자로 판별한다. 설명없이 해석할 수 없으니 더 나은 방법이 있을 것이라 생각한다.
address : 회원과 다르게 가게는 주소가 한 곳이다. 물론 실제 DB에서는 따로 테이블을 생성해서 1:1관계이겠지만 연습 과정이니까 간단하게 설계했다.
delivery_time : 배달 예상시간은 굳이 timestamp형식을 쓸 필요가 없고, 분 단위면 충분하다고 생각해서 int타입으로 만들었다.
rating : 평점은 (리뷰 별점 총 합)/(리뷰수) 이다. 배민의 가게 평점은 소수점 1자리까지만 보인다. 연습을 위해 처음 써보는 타입인 decimal를 골랐다.

리뷰

배민의 리뷰는 회원이 주문한 메뉴까지 볼 수 있다.
rating : 리뷰 평점은 1점에서 5점까지 1점 단위로 줄 수 있다.

메뉴

category : 메인메뉴, 주류, 등으로 나눌 수 있다.
popularity : 인기메뉴일시 메뉴 왼쪽 상단에 '인기' 아이콘을 표시한다.

메뉴 옵션

가게에서 주문할 메뉴를 클릭하면 옵션을 선택할 수 있다.
option : 가격, 매운맛 단계, 추가 구성품 등으로 카테고리 개념이다.
가격 : 메뉴가격 10000원에 고기추가(1000원)식으로 하는 곳도 있고, 메뉴 가격 10000원에 메뉴옵션에서 소(5000원), 대(10000원) 이런식으로 가격이 결정되는 가게도 있다. 여기서는 전자일 때만 생각한다.

주문

total_price : 주문메뉴 테이블의 주문메뉴가격을 합친 가격이다.

주문메뉴

주문 : 주문메뉴 = 1 : N, 메뉴 : 주문메뉴 = 1 : N
DB에서 다대다 관계를 설정할 수 없으므로 중간 테이블 역할을 해주는 주문메뉴 테이블을 만들었다. 이 테이블만이 다른 테이블들과 식별관계로 설계했다. 회원은 하나의 가게에서 하나의 메뉴만 주문하는 것이 아니므로 여러개의 주문메뉴 테이블을 생성할 것이다.
price : 메뉴의 가격 + 메뉴 옵션의 가격을 합친 가격이다.

마무리

이제 ERD 설계를 마쳤고 배민에서 3~5개의 화면을 선택해서 SELECT 쿼리문을 만드는 일만 남았다. 부트캠프 3주차이지만 지금까지는 따라하기의 느낌이라 피드백이 없었는데, 이번 3주차는 피드백이 구체적일 것 같아서 기대가 된다.

0개의 댓글