바이브 코딩 시대의 데이터베이스4-3 관계의 종류 — 1:1, 1:N, N:M
테크타니 LEARN — 섹션 04 · DB 모델링

관계의 종류 —
1:1, 1:N, N:M

두 테이블이 연결된다는 사실만 알아서는 부족합니다. 회원 한 명은 주문을 몇 건까지 할 수 있을까요? 반대로 주문 한 건은 회원 몇 명의 것일까요? 오늘은 이 두 질문으로 관계의 종류를 나눠 봅니다.

난이도보통소요8분준비물4-2 완료오늘표기보다 문장이 먼저

이번 섹션의 여정

4-1 관계의 구조

완료 ✓

4-2 부모 · 자식

완료 ✓

4-3 관계의 종류

지금 여기

4-4 ~ 4-7

ERD · 정규화 · 실습

회원과 주문 — 실제 데이터에서 1:N 찾기

먼저 우리 shop의 김철수 회원을 보겠습니다.

shop DB — 김철수(member_id 1)에게 연결된 주문
member_id회원연결된 주문번호주문 건수
1김철수1 · 6 · 14 · 20 · 27 · 346
앞으로 주문을 더 하면 연결되는 주문은 더 늘어날 수 있습니다

이번에는 반대로 주문 1번만 골라볼게요. 주문 1번은 김철수 회원 한 명의 주문입니다. 한 주문이 여러 회원의 주문일 수는 없죠.

두 방향으로 읽으면
방향읽은 문장
회원 → 주문회원 한 명은 주문 여러 건
주문 → 회원주문 한 건은 회원 한 명
한쪽은 하나, 한쪽은 여러 개 — 이 관계를 1:N (일 대 다) 이라고 부릅니다

회원 쪽의 1은 한 명, 주문 쪽의 N한 건을 넘어 여러 건까지 가능하다는 뜻입니다.

지금 몇 건인지와 관계 규칙은 다릅니다

여기서 주문 6건이라는 숫자를 그대로 관계 이름에 쓰면 안 됩니다.

현재 데이터 vs 관계 규칙
회원현재 주문 수두 회원에게 적용되는 규칙
김철수6건주문 0건부터 여러 건까지 가능
백서윤0건주문 0건부터 여러 건까지 가능
현재 숫자는 달라도 — 적용되는 규칙은 같습니다

김철수 회원은 지금 주문이 6건이지만 백서윤 회원은 0건입니다. 그래도 두 사람에게 적용되는 규칙은 똑같아요.

⭐ 가장 중요한 구분

지금 저장된 숫자는 현재 모습을 찍은 사진이고, 관계는 앞으로도 지켜야 할 규칙입니다.

그래서 현재 행을 세지 말고 — 업무에서 최대 몇 개까지 허용하는지를 봐야 합니다.

학생과 사물함 — 1:1

이번에는 1:1, 일 대 일을 보겠습니다.

설명용 생활 예시 · 실제 shop 구조가 아닙니다

현재 shop 에는 알맞은 1:1 관계가 없어서 학교 사물함을 예로 듭니다. 이 예시는 shop DB 에 존재하지 않아요.

이번 학기 규칙이 “학생 한 명당 현재 사물함 최대 한 칸” 이라고 해볼게요.

학생 — 현재 배정 사물함 (설명용 예시)
방향읽은 문장
학생 → 사물함학생 한 명은 현재 사물함 최대 한 칸
사물함 → 학생사물함 한 칸에도 현재 학생 최대 한 명
양쪽에서 보아도 최대 하나 — 그래서 1:1 입니다

아직 사물함을 배정받지 않은 학생이 있어도 최대가 하나라는 규칙은 바뀌지 않습니다.

주문과 상품 — 양쪽이 모두 여러 개인 N:M

이제 주문과 상품을 보겠습니다.

실제 주문 1번에는 라운드 티셔츠와 프리미엄 그래놀라가 함께 들어 있습니다. 즉 주문 한 건에는 상품이 여러 종류 들어갈 수 있어요.

이번에는 라운드 티셔츠 하나에서 반대로 생각해 봅니다. 라운드 티셔츠는 주문 1번에만 들어가는 상품이 아니에요.

shop DB — 라운드 티셔츠(product_id 1)가 담긴 주문들
order_idproduct_idquantity
111
712
1511
2312
같은 상품이 서로 다른 주문 네 건에 담겨 있습니다
두 방향으로 읽으면
방향읽은 문장
주문 → 상품주문 한 건에는 상품이 여러 종류
상품 → 주문상품 하나도 주문 여러 건에
양쪽 모두 여러 개 — 이 관계를 N:M (다 대 다) 이라고 부릅니다
N 과 M 은 외울 숫자가 아닙니다

NM 은 특정한 수를 뜻하지 않습니다. 양쪽 모두 여러 개라는 표시일 뿐이에요.

order_items — 주문과 상품이 만난 내용을 한 줄씩

그렇다면 주문과 상품의 이 관계를 데이터베이스에는 어떻게 적을까요? 두 테이블 사이에 order_items, 주문상세 테이블을 둡니다. 이 테이블은 주문과 상품이 만난 내용을 한 줄씩 기록해요.

shop DB — 주문 1번의 실제 주문상세
order_idproduct_idproduct_namequantity
11라운드 티셔츠1
116프리미엄 그래놀라2
한 줄 = 한 주문에 들어간 상품 한 종류

첫 번째 줄은 “주문 1번에 상품 1번, 라운드 티셔츠가 1개 들어 있다”, 두 번째 줄은 “주문 1번에 상품 16번, 프리미엄 그래놀라가 2개 들어 있다” 는 뜻입니다.

주문 한 건에서는 주문상세가 여러 줄 생길 수 있고, 상품 하나도 여러 주문의 주문상세에 나타날 수 있죠.

N:M 을 저장하는 방법
보는 관점구조
업무에서 보는 관계주문 여러 건 N ─── M 상품 여러 개
데이터베이스에 저장하는 구조orders 1 ─── N order_items
데이터베이스에 저장하는 구조products 1 ─── N order_items
N:M 업무 관계를 두 개의 1:N 으로 나누어 저장합니다
오해하기 쉬운 지점

N:M 이라는 업무 관계가 없어지는 것이 아닙니다. 저장하기 쉽게 풀어놓는 것뿐이에요.

quantity 를 정확히 읽는 법

quantity = 2 는 그래놀라가 언제나 2개라는 뜻이 아닙니다. 주문 1번에 그래놀라가 2개 들어갔다는 뜻이에요. 특정 주문과 특정 상품이 만났을 때 생긴 값입니다.

세 관계를 실제 문장으로 비교하기

구체적인 두 문장 → 관계 이름
구체적인 두 문장관계
학생 → 현재 사물함 최대 1 · 사물함 → 현재 학생 최대 11:1
회원 → 주문 여러 건 · 주문 → 회원 1명1:N
주문 → 상품 여러 종류 · 상품 → 주문 여러 건N:M
⭐ 관계 이름이 헷갈릴 때

표기부터 외우지 마세요. 한쪽에서 한 문장, 반대쪽에서 한 문장 — 이렇게 실제 말로 읽은 뒤 이름을 붙이면 됩니다.

한 번만 연습 — 카테고리와 상품

우리 shop의 카테고리와 상품으로 한 번만 연습해 볼게요.

의류 카테고리 하나에는 라운드 티셔츠, 슬림핏 청바지처럼 상품이 여러 개 들어갈 수 있습니다. 반대로 상품 하나는 현재 카테고리 하나에만 속하고요.

카테고리 — 상품
방향읽은 문장개수
카테고리 → 상품의류 하나에 티셔츠 · 청바지 · 후드 집업 …여러 개
상품 → 카테고리라운드 티셔츠는 의류 하나에만하나
한쪽은 여러 개, 반대쪽은 하나 — 카테고리와 상품은 1:N 입니다

방향을 바꿔 말해도 관계 자체는 같습니다. 카테고리 하나 대 상품 여러 개예요.

최대 개수와 최소 개수는 따로 봅니다

오늘 배운 1, N, M최대 몇 개까지 연결될 수 있는가를 알려줍니다.

0개여도 되는지, 반드시 하나는 있어야 하는지는 — 최소 개수에 관한 질문이에요.

최대만 읽은 오늘 · 최소까지 읽을 다음 강의
방향이번 강의에서 읽은 최대다음 강의에서 붙일 최소·최대
회원 한 명 → 주문여러 건0..N
주문 한 건 → 회원한 명1..1
회원은 주문이 0건이어도 되지만, 현재 shop 의 주문 한 건은 회원 한 명과 반드시 연결됩니다

이 차이는 다음 강의에서 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의 선과 기호로 읽어보겠습니다.

NEXT LESSON4-4 ERD 읽는 법 — 전체 관계망에서 데이터 경로 찾기

관계선 양쪽을 문장으로 읽고 — 지금 질문에 필요한 길만 골라 따라가는 법을 익힙니다.

GO ▸ 4-4 시작하기