관계형 데이터베이스(RDBMS) 사전 과제를 공부하고 세션 진행 후 조별로 스타벅스 음료 파트 ERD 구성도를 제작해 제출하는 과제를 받았다
각 테이블의 column 설계
menus table
- name (메뉴 이름 : ex)음료, 푸드, 상품)
categories table
- name (카테고리 이름 : ex)콜드 브루, 브루드, 에스프레소, 프라푸치노 등)
drinks table
- name (음료 이름)
- en_name (영문 이름)
- image (이미지 URI 주소)
- description_top (상단 음료 설명)
- descripton_bottom (하단 음료 설명)
- my_drink (나만의 음료 등록 여부)
nutritions table
- kcal (칼로리)
- natrium (나트륨)
- sat_fat (포화지방)
- sugar (당류)
- protein (단백질)
- caffeine (카페인)
sizes table
- name (사이즈명)
- ml (ml)
- oz (온스)
options table
- espresso (에스프레소 샷 추가 여부)
- decaffeine (디카페인 여부)
allergies table
- name (알레르기 이름)
drinks_allergies table
- drinks 테이블과 allergies 테이블의 many-to-many 관계로 인해 생성한 중간 테이블
- drinks_id (음료 ID)
- allergies_id (알레르기 ID)
각 테이블의 Relation Mapping
menus
one-to-many categories
categories
one-to-many drinks
drinks
many-to-many allergies
drinks
one-to-one options
drinks
one-to-one nutritions
nutritions
one-to-one sizes
Feedback
- 각 테이블의 이름은 테이블명_name이라고 하기 보다 name이라고 해주는게 좋다
- id에 사용되는 데이터 타입은 주로 INT형이지만 많은 id를 생성해야 하는 경우 BIGINT를 사용할수 있다.
- 스타벅스의 음료 이미지는 2종류(큰 이미지와 작은 이미지)이다. 각각 따로 분류해 저장하는것이 좋다
- 데이터 컬럼을 아끼려고 공수가 들어가는 작업을 하는거보단 데이터 설계단계에서 직접 분류해 직접 저장하는 방법이 더 단순할수 있다. ex) 사이즈 테이블에 ml 컬럼만 정의하고 ml 단위를 oz(온스) 단위로 계산하는 로직을 구현해 oz 단위를 계산하는것 보다는 ml, oz 컬럼을 처음부터 둘 다 설계하는게 더 좋은 방법이다.
- 영양성분의 단위는 FLOAT, INT 둘다 있으므로 DECIMAL(M,N)로 저장해 ROUND함수를 통해 소수점 제거를 하는 편이 좋다
- description_1, description_2 -> top_description, bottom_description
- drink 테이블에 image, description 컬럼을 넣어주기 보다는 따로 image, description 테이블을 만들어 관리하는게 나중에 데이터를 읽고 쓰는데 유리하다.
- 각 음료마다 줄 수 있는 옵션 (에스프레소 디카페인 샷추가)를 잘못 이해해서 각각 에스프레소 샷 추가 옵션, 디카페인 옵션으로 착각했다. 알고보니 디카페인 에스프레소 샷추가 옵션이였다(...) 이 옵션은 음료 카테고리별로 추가 가능여부가 갈리므로 espresso_shot이라는 테이블을 따로 만들어 categories 테이블과 one-to-one 관계로 연결해 관리하는걸 추천해주셨다.