3주차 - 4) 데이터베이스

변현섭·2023년 6월 8일
1

4th UMC Server-Spring Study

목록 보기
10/30

2. 배달의 민족 DB분석하기

1) 시스템 분석하기

배달의 민족 앱을 구성하기 위해 필요한 정보들이 무엇인지 생각해보자.

① 가게

  • store_id를 기본키로 사용
  • type은 배달이 가능한 경우 뿐 아니라, 배민1 서비스의 제공 및 포장 가능 여부를 보여준다. 3비트를 할당하여 LSB에는 배달여부, 중간비트에는 배민1, MSB에는 포장여부를 나타내어 최종 값을 비트 논리연산으로 판별한다.
  • delivery_time을 분 단위로 나타내기 위해 int타입을 사용한다.
  • rating은 (리뷰 별점 총 합)/(리뷰 수)를 의미한다. 배민에서는 평점을 소수점 1자리 까지만 나타내므로 decimal 타입을 선택한다.
  • created_date는 데이터가 생성된 시간을, modified_date는 데이터가 수정된 시간을 의미한다.

② 회원

  • user_id를 기본키로 사용한다. AUTO_INCREMENT를 사용한다.
  • grade는 전월 주문 횟수에 따라 결정되는 시스템이다. 기본은 '고마운 분'이다.
  • role은 회원과 사장으로 구분한다.
  • current_address의 경우 주소 테이블을 따로 만들 것이긴 하지만, 회원이 설정한 기본 주소를 저장하기 위해 사용한다.
  • status는 기본 상태인 일반, 휴면, 탈퇴, 정지가 있고 리뷰 금지 등의 상태도 있다고 한다.

③ 주소

  • 회원 : 주소는 1:N 관계를 갖는다. 즉, 회원이 여러 개의 주소를 등록할 수 있다.
  • 회원 ID는 외래키로 사용된다.

④ 쿠폰

  • 회원:쿠폰도 1:N 관계를 갖는다. 단, 쿠폰은 회원에 종속되지 않는다.

⑤ 찜

  • 회원은 여러 가게를 선택해서 찜할 수 있다. 가게는 찜의 총 숫자를 확인할 수 있다.

⑥ 리뷰

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

⑦ 메뉴

  • category: 메인 메뉴, 주류 등의 구분이다.
  • popularity: 인기 메뉴일시 메뉴 좌상단에 '인기' 아이콘을 표시한다.

⑧ 메뉴 옵션

  • 주문할 메뉴를 클릭하면 옵션을 선택할 수 있다.
  • 옵션에는 가격, 매운맛 단계, 사이드메뉴 추가 등의 카테고리 개념이다.
  • 가격: 메인 메뉴의 소/중/대 사이즈 선택에 대한 가격 차등은 고려하지 말고, 메뉴 가격에 토핑 등을 추가하는 경우만 고려하기로 하자.

⑨ 주문

  • total price는 아래의 주문 메뉴 테이블의 주문 메뉴가격을 합친 가격이다.

⑩ 주문메뉴

  • 주문:주문메뉴=1:N, 메뉴:주문메뉴=1:N의 관계를 가진다.

  • DB에서 다대다 관계를 설정할 수 없어 중간 테이블의 역할로 주문 메뉴 테이블을 만든 것이다. 회원이 한 가게에서 여러 메뉴를 주문할 경우 여러 개의 주문메뉴 테이블이 생성된다.

  • price는 메뉴의 가격에 메뉴 옵션의 가격을 합친 가격이다.

    ERD가 완성되면 아래와 같은 모습이 될 것이다. 참고로 분홍색 선은 비식별관계를 하늘색 선은 식별관계를 의미한다.

    ※ 식별관계와 비식별관계
    부모테이블의 기본키가 자식테이블의 기본키이자, 외래키로 쓰이는 경우에 두 테이블이 식별관계에 있다고 한다. 반면, 부모테이블의 기본키가 다른 테이블에서 기본키가 아닌 외래키로 쓰인다면 이는 비식별관계에 있다고 한다.

2) ERD 설계하기

참고로 Aquery Tool은 유료 서비스이다. 결제를 진행한 사람만 아래와 같은 실습을 진행할 수 있다. 무료버전에서도 테이블 5개까지는 지원되므로 대강 따라해보도록 하자.

① Aquery Tool 사이트에 들어가 아래와 같이 ERD 메뉴에서 "새로운 ERD"를 눌러준다.

② 그 후 아래와 같이 설정해준다.

③ 수정을 클릭한 후 ERD 메뉴 우측에 있는 설정 버튼을 클릭한다.

④ '논리'가 들어가는 속성은 체크 해제하고 나머지는 모두 체크한다.

⑤ 아래의 자동 생성 SQL옵션에서 FK, Join무시를 체크해준다.

⑥ 이제 우클릭을 통해 테이블을 생성하자. 테이블명은 파스칼 방식이라고 해서 대문자로 시작해야 한다. 먼저 USER라고 하는 회원테이블을 만들어보자.

⑦ 회원 테이블에서 기본 키는 user_id이고 AI 설정을 해준다.

  • 여기서 PK는 기본키로 주로 int형을 사용한다. 겹치면 안 되기 때문에 AI(Auto Increment)설정을 체크하면 편하다. AI설정은 새로운 데이터가 들어올 때마다 1씩 자동으로 늘어나는 설정이다.
  • NULL은 비어있어도 되는 항목에 대해서 체크해준다. NULL을 체크하지 않으면 값이 비어 있으면 안 된다는 의미이다.

⑧ 회원테이블과 마찬가지 방법으로, 가게(Store), 주소(Address), 쿠폰(Coupon), 찜(Dibs), 리뷰(Review), 메뉴(Menu), 메뉴옵션(Menu_Option), 주문(Order), 주문메뉴(Order_Menu) 테이블을 생성한다.

참고로 외래키를 기본키와 연결짓는 방법은 FK(Foreign Key)의 화살표를 드래그하여 참조테이블의 기본키에 드롭하면 된다. 최종 결과는 아래와 같은 모습이다. 각 테이블의 구성도 첨부하였다. 테이블을 작성하고 우클릭 > 테이블 정렬, 우클릭 > 테이블 재배치를 누르면 아래와 같이 깔끔하게 표시된다.

  • Address 테이블 → user_id는 user테이블의 기본키인 user_id에 연결된다.

    user_id는 user테이블의 기본키인 user_id에 연결된다.
  • Coupon 테이블 → user_id는 user테이블의 기본키인 user_id에 연결된다.
  • Dibs 테이블 → user_id는 user테이블의 기본키인 user_id에 연결되고, store_id는 store테이블의 기본키인 store_id에 연결된다.
  • Review 테이블 → user_id는 user테이블의 user_id에 연결되고, store_id는 store테이블의 store_id에 연결되며, menu_id는 menu테이블의 기본키인 menu_id에 연결된다.
  • Review_Picture_Url 테이블 → review_id는 Review테이블의 기본키인 review_id에 연결된다. 리뷰사진에 대해 별도의 테이블을 만든 이유는 사진을 여러 개 업로드 할 경우, 중복이 발생하기 때문이다. 즉, 정규화를 위해 추가한 것이다.
  • Store_Picture_Url 테이블 → store_id는 Store테이블의 기본키인 store_id에 연결된다. 이 테이블 역시 정규화를 위해 추가한 것이다.
  • Store 테이블
  • Order 테이블
  • Order_Menu 테이블 → order_id는 Order테이블의 기본키인 order_id에 연결되고, menu_id는 menu테이블의 기본키인 menu_id와 연결되며, menu_option_id는 Menu_Option테이블의 기본키인 menu_option_id와 연결된다.

    이 때, order_id는 Order_Menu 테이블의 기본키이면서 외래키이다. 따라서 Order 테이블과 Order_Menu 테이블은 식별관계에 있다.

  • Menu 테이블 → store_id는 Store테이블의 기본키인 store_id에 연결된다.
  • Menu_Option 테이블 → menu_id는 Menu테이블의 기본키인 menu_id에 연결된다.

[이미지 출처]

profile
Java Spring, Android Kotlin, Node.js, ML/DL 개발을 공부하는 인하대학교 정보통신공학과 학생입니다.

0개의 댓글