현재 장바구니, 주문 테이블은 한개의 옵션만 선택할 수 있다는 가정하에 만들어졌다.
하지만 메뉴와 옵션이 추가되어 여러개의 옵션을 고를 수 있는 메뉴가 생겨났다.
그에 따라 메뉴와 옵션의 다대다 설정이 필요해졌다.

다대다 옵션 설정을 위해 cart_option과 order_item_option 테이블을 생성했다.
두 테이블의 각 컬럼은 다른 테이블의 기본 키를 참조하는 외래 키로만 구성이 되어 있다.
이런 종류의 테이블을 연결 테이블 (결합 테이블, 다대다 관계 테이블)이라고 부른다.
이 테이블들의 각 행은 각각 cart, order와 option 간의 특정 관계를 나타낸다.
cart_id, option_id / order_item_id, option_id의 조합이 고유해야 하므로, 데이터 무결성을 위해 기본키는 복합키로 구성했다.
👉 복합키를 쓰지 않고 인조키를 생성한 이유 (비식별 관계)
cart, cart_option 사용 예시

- 고객이 특정 메뉴를 선택하고, 그 메뉴의 수량을 결정하여 장바구니에 담는다. 이 정보는 cart 테이블의 새로운 레코드로 저장된다. 이 때 menu_id는 선택된 메뉴를 참조하고, user_id는 현재 고객의 ID를 참조하며 quantity는 고객이 선택한 수량을 나타낸다.
- 만약 고객이 옵션을 선택한 경우, 이 정보는 cart_option 테이블에 새로운 레코드로 저장된다. cart_id는 방금 생성된 cart 테이블의 레코드를 참조하며, option_id는 고객이 선택한 옵션을 참조한다.
- 고객이 다른 메뉴나 옵션을 선택하면 이 과정은 반복된다. 각각의 메뉴와 옵션 선택은 cart 테이블과 cart_option 레코드로 이루어 진다.
- 👉 즉, 고객의 장바구니는 cart 테이블의 하나 또는 여러 개의 레코드로 구성된다. 이 때 선택된 옵션들은 각 cart 레코드에 연결된 cart_option 레코드로 이루어진다.
예시:
user 테이블
user_id | user_name |
1 | John Doe |
menu 테이블
menu_id | menu_name | price |
1 | T-BONE Steak | 30.00 |
2 | Club Sandwich | 13.00 |
option 테이블 (menu와 option의 연결 테이블이 있지만 예시에서는 생략한다)
option_id | option_name |
1 | Rare |
2 | Medium |
3 | French Fries |
4 | Hash Brown |
고객 John Doe는 스테이크와 샌드위치를 주문하려고 한다.
먼저 티본 스테이크를 한 개 담는다. 굽기는 레어, 감자는 프렌치 프라이를 골랐다.
이번에는 다른 옵션으로 티본 스테이크를 한 개 담는다. 굽기는 레어, 감자는 해쉬 브라운을 골랐다.
그리고 클럽 샌드위치를 프렌치 프라이 옵션으로 두 개 장바구니에 담았다.
cart 테이블
cart_id | user_id | menu_id | quantity |
1 | 1 | 1 | 1 |
2 | 1 | 1 | 1 |
3 | 1 | 2 | 2 |
cart_option 테이블
cart_option_id | cart_id | option_id |
1 | 1 | 1 |
2 | 1 | 3 |
3 | 2 | 1 |
4 | 2 | 4 |
5 | 3 | 3 |
orders, order_item, order_item_option 사용 예시
위 장바구니 정보를 토대로 주문할 경우
orders 테이블
order_id | user_id | order_date | price | payment_method | delivery_address | delivery_contact | special_instruction | order_status |
1 | 1 | 2023-07-05 12:00:01 | 73.00 | CASH | Bldg 100, 12-12 | +821012341234 | null | PROCESSING |
order_item 테이블
order_item_id | order_id | menu_id | quantity |
1 | 1 | 1 | 1 |
2 | 1 | 1 | 1 |
3 | 1 | 2 | 2 |
oder_item_option 테이블
order_item_option_id | order_item_id | option_id |
1 | 1 | 1 |
2 | 1 | 3 |
3 | 2 | 1 |
4 | 2 | 4 |
5 | 3 | 3 |