.png)
데이터베이스란?
- 데이터베이스란 데이터를 저장하는 시스템이다.
- 데이터를 저장 및 보전, 관리하기 위해서 데이터 베이스를 사용한다.(<-> 메모리)
- 관계형 데이터베이스(RDBMS)와 “NoSQL”로 명칭되는 비관계형(Non-relational) 데이터베이스가 있다.
관계형 데이터베이스(RDBMS, Relational DataBase Management System)
관계형 데이터
란 데이터를 서로 상호관련성을 가진 형태로 표현한 데이터이다. 그리고 데이터는 테이블로 표현된다.
- 테이블끼리의 연결에는 크게 3가지 종류가 있다.
- One To One : 테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭이 되는 관계
ex) users and user_profiles

- One To Many : 테이블 A의 로우가 테이블 B의 여러 로우와 연결이 되는 관계
ex) 각 고객은 여러 제품을 구매할 수 있지만 구매된 제품의 주인은 오직 한 고객 뿐이다
- customer 테이블과 order 테이블이 One To Many의 관계에 있다.
- order 테이블의 customer_id 컬럼이 customer 테이블의 primary key를 foreign key로 가지고 있다.
- order 테이블이 customer 테이블을 참조한다.
- many To Many : 테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결이 되는 관계
ex) 책은 여러 작가에 의해 쓰일 수 있고 작가들은 여러 책을 쓸 수 있다
- 중간테이블에는 양쪽 테이블에서 참조해온 id의 조합이 저장된다.
- id의 조합 뿐만 아니라 추가적인 데이터도 저장될 수 있다.
어떻게 테이블과 테이블을 연결하는가?
- Foreign key(외부키)라는 개념을 사용하여 주로 연결한다.
- 앞서 본 one to one 예에서 user_profiles 테이블의 user_id 컬럼은 users 테이블에 걸려있는 외부 키라고 지정한다.
- 즉, 데이터베이스에게 user_id의 값은 users 테이블의 id 값이며 그러므로 users 테이블의 id 컬럼에 존재하는 값만 생성될 수 있다.
왜 테이블들을 연결하는가?
- 중복된 데이터를 저장하지 않음으로 디스크를 더 효율적으로 쓸 수 있다.
- 서로 같은 데이터이지만 부분적으로만 내용이 다른 데이터가 생기는 문제가 없어진다.
- 이것을 normalization(정규화)이라고 한다.
스타벅스 모델링

스타벅스의 음료 정보를 모델링해보았다. (모델링 도구 사이트)
- 필수 구현 : 음료 이름, 카테고리, 영양 정보, 알러지, 음료 이미지, 음료 설명, 신상 여부
- 구현 제외 사항 : 프로모션, 음료 사이즈
모델링 설명
<테이블 및="" 컬럼="" 구성="">
- `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`는 따로 테이블로 분리할 수 있으나, 따로 구분할 만큼 중요하지 않으므로 분리하지 않는다.
### 모델링 시 참고사항
- 컬럼명은 축약하지 않고 작성한다. ex) `eng_name`(x) `english_name`(o)
- 테이블명은 복수로, 컬럼명은 단수로 작성하는 것이 좋다.
- foreign key의 이름은 `참조하는 테이블명_id`로 한다.
테이블>테이블>