관계의 종류 —
1:1, 1:N, N:M
두 테이블이 연결된다는 사실만 알아서는 부족합니다. 회원 한 명은 주문을 몇 건까지 할 수 있을까요? 반대로 주문 한 건은 회원 몇 명의 것일까요? 오늘은 이 두 질문으로 관계의 종류를 나눠 봅니다.
이번 섹션의 여정
완료 ✓
완료 ✓
지금 여기
ERD · 정규화 · 실습
회원과 주문 — 실제 데이터에서 1:N 찾기
먼저 우리 shop의 김철수 회원을 보겠습니다.
| member_id | 회원 | 연결된 주문번호 | 주문 건수 |
|---|---|---|---|
| 1 | 김철수 | 1 · 6 · 14 · 20 · 27 · 34 | 6 |
이번에는 반대로 주문 1번만 골라볼게요. 주문 1번은 김철수 회원 한 명의 주문입니다. 한 주문이 여러 회원의 주문일 수는 없죠.
| 방향 | 읽은 문장 |
|---|---|
| 회원 → 주문 | 회원 한 명은 주문 여러 건 |
| 주문 → 회원 | 주문 한 건은 회원 한 명 |
회원 쪽의 1은 한 명, 주문 쪽의 N은 한 건을 넘어 여러 건까지 가능하다는 뜻입니다.
지금 몇 건인지와 관계 규칙은 다릅니다
여기서 주문 6건이라는 숫자를 그대로 관계 이름에 쓰면 안 됩니다.
| 회원 | 현재 주문 수 | 두 회원에게 적용되는 규칙 |
|---|---|---|
| 김철수 | 6건 | 주문 0건부터 여러 건까지 가능 |
| 백서윤 | 0건 | 주문 0건부터 여러 건까지 가능 |
김철수 회원은 지금 주문이 6건이지만 백서윤 회원은 0건입니다. 그래도 두 사람에게 적용되는 규칙은 똑같아요.
지금 저장된 숫자는 현재 모습을 찍은 사진이고, 관계는 앞으로도 지켜야 할 규칙입니다.
그래서 현재 행을 세지 말고 — 업무에서 최대 몇 개까지 허용하는지를 봐야 합니다.
학생과 사물함 — 1:1
이번에는 1:1, 일 대 일을 보겠습니다.
현재 shop 에는 알맞은 1:1 관계가 없어서 학교 사물함을 예로 듭니다. 이
예시는 shop DB 에 존재하지 않아요.
이번 학기 규칙이 “학생 한 명당 현재 사물함 최대 한 칸” 이라고 해볼게요.
| 방향 | 읽은 문장 |
|---|---|
| 학생 → 사물함 | 학생 한 명은 현재 사물함 최대 한 칸 |
| 사물함 → 학생 | 사물함 한 칸에도 현재 학생 최대 한 명 |
아직 사물함을 배정받지 않은 학생이 있어도 최대가 하나라는 규칙은 바뀌지 않습니다.
주문과 상품 — 양쪽이 모두 여러 개인 N:M
이제 주문과 상품을 보겠습니다.
실제 주문 1번에는 라운드 티셔츠와 프리미엄 그래놀라가 함께 들어 있습니다. 즉 주문 한 건에는 상품이 여러 종류 들어갈 수 있어요.
이번에는 라운드 티셔츠 하나에서 반대로 생각해 봅니다. 라운드 티셔츠는 주문 1번에만 들어가는 상품이 아니에요.
| order_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 1 |
| 7 | 1 | 2 |
| 15 | 1 | 1 |
| 23 | 1 | 2 |
| 방향 | 읽은 문장 |
|---|---|
| 주문 → 상품 | 주문 한 건에는 상품이 여러 종류 |
| 상품 → 주문 | 상품 하나도 주문 여러 건에 |
N 과 M 은 특정한 수를 뜻하지 않습니다. 양쪽 모두 여러 개라는 표시일
뿐이에요.
order_items — 주문과 상품이 만난 내용을 한 줄씩
그렇다면 주문과 상품의 이 관계를 데이터베이스에는 어떻게 적을까요? 두 테이블 사이에 order_items, 주문상세 테이블을 둡니다. 이 테이블은 주문과 상품이 만난 내용을 한 줄씩 기록해요.
| order_id | product_id | product_name | quantity |
|---|---|---|---|
| 1 | 1 | 라운드 티셔츠 | 1 |
| 1 | 16 | 프리미엄 그래놀라 | 2 |
첫 번째 줄은 “주문 1번에 상품 1번, 라운드 티셔츠가 1개 들어 있다”, 두 번째 줄은 “주문 1번에 상품 16번, 프리미엄 그래놀라가 2개 들어 있다” 는 뜻입니다.
주문 한 건에서는 주문상세가 여러 줄 생길 수 있고, 상품 하나도 여러 주문의 주문상세에 나타날 수 있죠.
| 보는 관점 | 구조 |
|---|---|
| 업무에서 보는 관계 | 주문 여러 건 N ─── M 상품 여러 개 |
| 데이터베이스에 저장하는 구조 | orders 1 ─── N order_items |
| 데이터베이스에 저장하는 구조 | products 1 ─── N order_items |
N:M 이라는 업무 관계가 없어지는 것이 아닙니다. 저장하기 쉽게 풀어놓는 것뿐이에요.
quantity = 2 는 그래놀라가 언제나 2개라는 뜻이 아닙니다. 주문 1번에
그래놀라가 2개 들어갔다는 뜻이에요. 특정 주문과 특정 상품이 만났을 때 생긴
값입니다.
세 관계를 실제 문장으로 비교하기
| 구체적인 두 문장 | 관계 |
|---|---|
| 학생 → 현재 사물함 최대 1 · 사물함 → 현재 학생 최대 1 | 1:1 |
| 회원 → 주문 여러 건 · 주문 → 회원 1명 | 1:N |
| 주문 → 상품 여러 종류 · 상품 → 주문 여러 건 | N:M |
표기부터 외우지 마세요. 한쪽에서 한 문장, 반대쪽에서 한 문장 — 이렇게 실제 말로 읽은 뒤 이름을 붙이면 됩니다.
한 번만 연습 — 카테고리와 상품
우리 shop의 카테고리와 상품으로 한 번만 연습해 볼게요.
의류 카테고리 하나에는 라운드 티셔츠, 슬림핏 청바지처럼 상품이 여러 개 들어갈 수 있습니다. 반대로 상품 하나는 현재 카테고리 하나에만 속하고요.
| 방향 | 읽은 문장 | 개수 |
|---|---|---|
| 카테고리 → 상품 | 의류 하나에 티셔츠 · 청바지 · 후드 집업 … | 여러 개 |
| 상품 → 카테고리 | 라운드 티셔츠는 의류 하나에만 | 하나 |
방향을 바꿔 말해도 관계 자체는 같습니다. 카테고리 하나 대 상품 여러 개예요.
최대 개수와 최소 개수는 따로 봅니다
오늘 배운 1, N, M은 최대 몇 개까지 연결될 수 있는가를 알려줍니다.
0개여도 되는지, 반드시 하나는 있어야 하는지는 — 최소 개수에 관한 질문이에요.
| 방향 | 이번 강의에서 읽은 최대 | 다음 강의에서 붙일 최소·최대 |
|---|---|---|
| 회원 한 명 → 주문 | 여러 건 | 0..N |
| 주문 한 건 → 회원 | 한 명 | 1..1 |
이 차이는 다음 강의에서 ERD의 기호와 함께 정확히 읽어보겠습니다.
한눈에 정리
| 관계 | 읽는 법 | shop 에서는 |
|---|---|---|
| 1:1 | 양쪽 모두 최대 하나 | 없음 (학생 — 사물함은 설명용 예시) |
| 1:N | 한쪽은 하나, 반대쪽은 여러 개 | 회원 — 주문 / 카테고리 — 상품 |
| N:M | 양쪽 모두 여러 개 | 주문 — 상품 |
| 연결 테이블 | N:M 을 두 개의 1:N 으로 나눠 저장 | order_items |
관계는 현재 데이터 수가 아니라 업무에서 허용하는 최대 연결 수로 판단합니다. 하나와 하나는 1:1, 하나와 여러 개는 1:N, 여러 개와 여러 개는 N:M이고 — N:M 관계는 order_items 같은 연결 테이블을 가운데 두어 저장합니다.
다음 강의에서는 이 관계를 실제 ERD의 선과 기호로 읽어보겠습니다.