Database (2) 스타벅스 서비스 모델링 + 정규화

2021. 10. 12. 20:53프로그래밍/데이터베이스

반응형

🚀️ Mission : 스타벅스 서비스 모델링

팀 미션 💫️

주제 : 스타벅스 음료 페이지 모델링

⭕️ 필수 항목

: 카테고리 | 음료 | 영양 정보 | 알러지 | 음료 이미지 | 음료 설명 | 신상 여부(상세분류)

❌️ 제외 항목

: 프로모션, 음료사이즈

 

☕️ 모델링 페이지

음료 페이지 - 메인

starbucks1

음료 페이지 - 상세

starbucks2

 

:: 완성된 ER-Diagram

starbucks_erd

 

:: 테이블 설계

category

ID pk | 카테고리 이름

  • 카테고리 테이블
  • Define 항목들은 따로 빼서 관리할 수 있도록 카테고리 테이블을 따로 생성

 

beverage

카테고리_ID fk | ID pk | 음료 이름_kor | 음료 이름_eng | 음료 이미지 | 음료설명 | 알러지

  • 음료 테이블
  • 음료에 종속되는 항목인 음료이름(kor/eng), 이미지, 설명, 알러지 정보를 컬럼으로 추가
  • 알러지를 유발하는 항목이 특정되는 경우, 컬럼 분리 고려

 

nuturition_info

음료_ID fk | 1회 제공량 | 나트륨 | 포화지방 | 당류 | 단백질 | 카페인

  • 음료 영양정보 테이블
  • 음료마다 다르게 나오는 영양정보를 관리

 

beverage_type

음료_ID fk | 신상여부(Y/N) | 시즌여부(Y/N)

  • 음료 상세분류를 위한 분류 테이블
  • 음료별 신상음료여부와 시즌음료여부를 bool값으로 기입할 수 있도록 지정

 

:: 느낀점

왜 이렇게 설계했는지, 설계에 대해 명확한 근거를 들일 수 있도록 정규화와 역정규화 공부해서 다시 생각해보기

 

iwillbeback_meme

 

+ 추가 (2021.10.13)

🌈️ 정규화

관계형 데이터 베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업

:: 제 1 정규형

애트리뷰트의 도메인이 오직 원자값만을 포함 (즉, 하나의 속성이 단일값을 갖도록 설계)

:: 제 2 정규형

주식별자가 아닌 속성들이 주식별자에 완전 함수적 종속인 것

:: 제 3 정규형

비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태

ex) 판매 테이블안에 고객정보가 있으면 제 3 정규화를 진행해야함.

 

🤔️ 테이블 설계 다시 생각해보기

image

category

  • 카테고리 항목이 추가되는 경우, 카테고리 항목만 따로 관리하는 것이 확장에 유리하다.

예시 : '콜드브루' 카테고리가 '더치커피'로 변경되야 한다면?

만약 beverage 테이블에 카테고리가 종속되어 있다면, 카테고리가 '콜드브루'인 모든 항목들을 찾아서 데이터를 변경해줘야 한다.

하지만 category 테이블로 따로 관리한다면, category_name 컬럼의 단 하나의 데이터만 수정해주면 될 것이다.

 

beverage

  • 주식별자인 음료ID에 완전 함수적 종속인 항목들만 컬럼으로 생성했다.
  • 음료가 가지는 데이터에는 카테고리, 음료이름(kor, eng), 음료설명, 이미지, 알러지, 제품 영양 정보 등 다양한 정보들이 있었지만 제품 영양 정보는 확장성을 위해 분리시켰다.

🚨️🙄️ 설계 할 때 놓친 부분

이미지, 알러지는 다중값이 될 수 있고, 알러지는 다른 곳에서도 사용할 수 있으므로 따로 분리해서 관리할 필요가 있다.

allergies

ID pk | 알러지

beverage_allergies

ID pk | 음료 ID fk | 알러지 ID

beverage_images

ID pk | 음료 ID fk | Url

 

nuturition_info

  • beverage 의 주식별자인 음료ID에 종속되지만 영양 정보 관련 항목이 많고, 영양정보가 추가될 경우를 고려하여 테이블을 따로 관리하는 것이 용이할 것으로 보여 테이블을 따로 생성하였다.

예시 : 일부 음료에 '탄수화물, 트랜스지방, 콜레스테롤' 항목이 추가된다면?

영양정보가 beverage 테이블에 종속되어 있었다면, 모든 음료가 탄수화물, 트랜스지방, 콜레스테롤을 null 혹은 0 의 값으로 표기해야 했을 것이다.

nuturition_info 테이블에서 관리한다면 컬럼이 추가되는 것은 동일하지만 beverage 테이블과 조인해서 컬럼을 가져오기 때문에 필요하지 않은 컬럼(탄수화물, 트랜스지방, 콜레스테롤)에 대해서는 가져오지 않아도 된다.

 

beverage_type

  • 상세분류를 위한 신상/시즌 여부이므로 따로 관리할 수 있도록 테이블을 생성했다.
반응형