관계형 데이터
란 데이터를 서로 상호관련성을 가진 형태로 표현한 데이터이다. 그리고 데이터는 테이블로 표현된다.
테이블끼리의 연결에는 크게 3가지 종류가 있다.
One To One : 테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭이 되는 관계
ex) users and user_profiles
One To Many : 테이블 A의 로우가 테이블 B의 여러 로우와 연결이 되는 관계
ex) 각 고객은 여러 제품을 구매할 수 있지만 구매된 제품의 주인은 오직 한 고객 뿐이다
many To Many : 테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결이 되는 관계
ex) 책은 여러 작가에 의해 쓰일 수 있고 작가들은 여러 책을 쓸 수 있다
스타벅스의 음료 정보를 모델링해보았다. (모델링 도구 사이트)
<테이블 및 컬럼 구성>
drinks
테이블에는 음료의 한글 이름, 영어 이름, 설명, 신상 여부가 포함되었다. 신상 여부는 True or False의 관계로 이름은 is_new
, 타입은 TINYINT
로 설정해 0과 1을 입력할 수 있도록 한다. categories
테이블에는 카테고리의 이름이 들어간다. images
테이블에는 이미지 url이 들어간다. url의 길이가 길 수도 있으므로 VARCHAR(2000)
로 문자의 길이를 넉넉하게 지정해준다. allergies
테이블에는 알러지 이름이 들어간다.nutritions
테이블에는 1회 제공량, 포화지방, 단백질, 나트륨, 당류, 카페인 총 6가지의 영양 정보와 기준 사이즈가 들어간다. 영양정보가 없을 수 있으므로 NULL
에 체크한다.<테이블 간 관계>
categories
테이블과 drinks
테이블은 one to many
의 관계이다. 따라서 drinks
테이블은 categories
테이블을 참조한다. 다시 말해, drinks
테이블의 category_id
컬럼은 categories
테이블의 pk를 fk로 가지고 있다.images
테이블은 drinks
테이블을 참조한다. many to many
의 관계이다. 각각의 테이블을 참조하는 fk로 구성된 중간테이블 drinks_allergies
를 만든다. one to one
이다. one to one
일 때는 어느 쪽을 참조해도 상관없다.nutritions
의 size
는 따로 테이블로 분리할 수 있으나, 따로 구분할 만큼 중요하지 않으므로 분리하지 않는다. eng_name
(x) english_name
(o) 참조하는 테이블명_id
로 한다.