AI 시대 DB 모델링 & SQL 완벽 마스터4-3 1:1 / 1:N / N:M
테크타니 LEARN — 섹션 04 · DB 모델링

1:1 / 1:N / N:M,
질문 하나로 전부 갈립니다

4-2에서 잡은 부모-자식 관계 — 그 안에는 세 가지 형태가 있습니다. 1:1, 1:N, N:M. 셋을 구분하는 질문은 단 하나, "한 X가 여러 Y를 가질 수 있나? 그 반대도?" 이 세 개만 구분할 줄 알면 모델링의 90%가 풀립니다.

난이도보통소요6분준비물4-2 부모-자식 개념핵심식별 질문 한 줄

이번 섹션의 여정

4-1 ~ 4-2 관계·부모/자식

완료 ✓

4-3 관계의 세 종류

지금 여기

4-4 외래키(FK)와 무결성

관계를 DB가 강제

4-5 ~ 4-8 ERD·정규화·실습

모델링 완성

섹션 5 — AI 협업 SQL 작성법

다음 마일스톤

식별 질문은 단 하나입니다

세 관계를 구분하겠다고 정의 세 개를 외울 필요가 없습니다. 던질 질문은 딱 하나 — 단, 양쪽에 다 던집니다.

⭐ 식별 질문 — 강의 끝까지 들고 갈 한 줄

“한 X 가 여러 Y 를 가질 수 있나? 그 반대도?” — 두 질문의 답 조합으로 세 관계가 전부 갈립니다.

한 X 가 여러 Y?한 Y 가 여러 X?결과
NONO1:1
YESNO1:N
YESYESN:M

외울 게 없어요. “항상 양쪽 다 물어본다” — 이것만 기억하면 됩니다. 이제 흔한 순서대로 하나씩 보겠습니다.

1:N — 실무 데이터의 90%

가장 흔한 형태부터. 회원과 주문에 식별 질문을 양쪽으로 던져보면 —

질문
한 회원이 여러 주문을 가질 수 있나?YES — 한 명이 100번 살 수 있죠
한 주문이 여러 회원을 가질 수 있나?NO — 한 주문은 한 사람 것

한쪽만 YES — 그래서 회원 1 : 주문 N. 말로만 하지 말고 우리 shop DB에서 눈으로 확인해볼까요.

SELECT
  order_id,
  ordered_at
FROM
  orders
WHERE
  member_id = 1;   -- 1번 회원 김철수의 주문
DBeaver — SQL Editor (Ctrl + Enter)
SELECT order_id, ordered_at FROM orders WHERE member_id = 1;
order_idordered_at
12025-02-01
62025-04-10
142025-08-01
202025-10-12
272025-12-10
342026-02-15
반대 방향은? orders 한 행에 member_id 칸은 하나뿐 — 주문 1건의 주인은 1명
6 rows — 회원 1명(김철수)에게 주문 6건

한쪽에만 “여러”가 붙으면 1:N — 그리고 4-2에서 찾은 shop의 부모-자식 4쌍은 전부 이 형태입니다.

shop — 부모-자식 4쌍, 전부 1:N
members 1 ──▶ N orders (한 회원이 여러 주문)
orders 1 ──▶ N order_items (한 주문에 여러 상세 줄)
categories 1 ──▶ N products (한 카테고리에 여러 상품)
products 1 ──▶ N order_items (한 상품이 여러 주문상세에)
 
부모가 1, 자식이 N — FK 를 들고 있는 쪽이 항상 N 쪽

N:M — 양쪽 다 “여러”

이번엔 주문과 상품. 같은 질문을 양쪽으로 —

질문
한 주문이 여러 상품을 가질 수 있나?YES — 장바구니에 5개 담아 한 번에 주문
한 상품이 여러 주문에 들어갈 수 있나?YES — 인기 상품은 1000번 팔리죠

양쪽 다 YES — 주문 N : 상품 M. 이것도 shop 데이터로 양방향을 직접 확인해봅니다.

-- 한 상품이 여러 주문에: 22번 상품(SQL 입문서)이 담긴 주문들
SELECT
  order_id
FROM
  order_items
WHERE
  product_id = 22;
 
-- 한 주문에 여러 상품이: 25번 주문에 담긴 상품들
SELECT
  product_id,
  quantity
FROM
  order_items
WHERE
  order_id = 25;
DBeaver — N:M 을 양방향으로 확인
SELECT
order_id
FROM
order_items
WHERE
product_id = 22;
 
order_id
────────
2 │ 8 │ 14 │ 17 │ 24 │ 32 │ 40
7 rows — 상품 1개(SQL 입문서)가 주문 7건에 등장
DBeaver — N:M 을 양방향으로 확인
SELECT product_id, quantity FROM order_items WHERE order_id = 25;
product_idquantity
271
281
301
3 rows — 주문 1건에 상품 3개 (수분 크림·클렌징 폼·립스틱)

N:M 은 직접 못 만듭니다 — 중간 테이블

여기가 이 강의에서 제일 중요한 지점입니다.

⭐ N:M 의 규칙

DB 는 N:M 을 직접 표현하지 못합니다. 항상 중간 테이블로 풀어줍니다 — shop 에서는 order_items 가 바로 그 중간 테이블입니다.

N:M 한 쌍 → 1:N 두 쌍으로 풀기
orders ↔ products 의 N:M — 직접 연결 불가
 
orders ──1:N──▶ order_items ◀──N:1── products
(주문) (중간 테이블) (상품)
 
N:M 한 쌍 = 1:N + N:1 두 쌍으로 풀어서 표현

4-2에서 order_items 가 두 부모(orders, products)를 가진 자식이었던 게 기억나시나요? 그게 바로 N:M 이 풀린 모습이었던 겁니다. 이 패턴은 도메인만 바뀔 뿐 어디서나 똑같이 나옵니다.

도메인N:M 관계중간 테이블
쇼핑몰주문 ↔ 상품order_items
학원학생 ↔ 강의enrollments
블로그게시글 ↔ 태그post_tags
SNS사용자 ↔ 사용자 (팔로우)follows
ERD 에서 N:M 을 찾는 신호

FK 를 두 개 들고 양쪽 부모 사이에 끼어 있는 테이블 — 이런 중간 테이블이 보이면 거의 항상 N:M 관계입니다. N:M 은 ERD 에 항상 “중간 테이블이 끼어있다” 로 나타나요.

덤 — order_items 의 PK 가 복합키인 이유

order_items 의 PK 는 (order_id, product_id) 복합키입니다. 한 주문에 같은 상품이 두 줄로 못 들어가게 막는 — 중간 테이블의 전형적인 설계예요.

1:1 — 가장 드문 형태

마지막으로 회원과 회원프로필. 양쪽 다 물어보면 —

질문
한 회원이 여러 프로필을 가질 수 있나?NO — 한 사람당 1개
한 프로필이 여러 회원에게 속할 수 있나?NO

양쪽 다 NO — 1:1. 그런데 1:1 은 보자마자 자연스러운 의문이 듭니다. “어차피 1개씩 짝인데, 굳이 테이블을 쪼개야 하나?” — 맞는 의문이에요.

✕ 대부분의 경우

굳이 안 쪼갭니다

1:1 이면 두 테이블을 합쳐도 행 수가 안 늘어납니다. “그냥 컬럼으로 넣으면 되잖아?” — 그래서 실무에서 1:1 은 거의 안 씁니다. shop 에도 1:1 은 하나도 없죠.

✓ 그래도 쪼개는 3가지 경우

크기 · 보안 · 선택 정보

① 테이블이 너무 커서 자주 안 쓰는 컬럼을 분리하고 싶을 때 ② 보안 — 주민번호·결제정보 같은 민감 정보를 별도 테이블로 ③ 선택적 정보 — 가입 시 필수가 아니고 나중에 채우는 정보 (프로필 사진, 자기소개).

세 관계 한눈 정리

관계두 질문의 답실무 빈도대표 예
1:1양쪽 다 NO드묾회원 ↔ 회원프로필
1:N한쪽만 YES가장 흔함 — 약 90%회원 → 주문
N:M양쪽 다 YES중간 — 항상 중간 테이블 동반주문 ↔ 상품, 학생 ↔ 강의
✓ 가져갈 것 두 가지

식별 질문“한 X 가 여러 Y? 한 Y 가 여러 X?” · N:M 신호 — ERD 에 중간 테이블이 끼어있다.

AI 에게 관계 종류까지 알려주세요

4-2에서 부모-자식 관계를 명시하면 AI 의 SQL 정확도가 확 올라간다고 했죠. 거기에 관계 종류 한 줄을 더하면 정확도가 한 단계 더 올라갑니다.

[관계]
- members 1:N orders
- orders 1:N order_items
- categories 1:N products
- orders N:M products (중간 테이블: order_items)
이 한 줄이 하는 일

AI 가 JOIN 방향(어느 테이블에서 어느 테이블로 타고 갈지)과 GROUP BY 단위(1쪽 기준으로 묶을지, N쪽 기준으로 묶을지)를 정확히 잡습니다. 3-7에서 본 JOIN 뻥튀기도 — N:M 을 미리 알려주면 AI 가 알아서 피해 갑니다.

자주 막히는 지점

① 1:N 에서 어느 쪽이 1인지 자꾸 헷갈려요

식별 질문의 답으로 충분하지만, 테이블 구조로도 즉시 판별됩니다.

FIX ▸FK 를 들고 있는 쪽이 항상 N(자식)입니다. orders member_id 를 들고 있으니 orders 가 N 쪽.
② 1:N 인지 N:M 인지 애매해요

한 방향만 물어보고 결론 내리는 게 가장 흔한 실수입니다. 질문은 항상 두 번.

FIX ▸반드시 양쪽 다 물어보세요. 한쪽이라도 NO 가 나오면 N:M 이 아닙니다.
③ ERD 에서 N:M 을 어떻게 알아보나요?

ERD 에 N:M 이라고 써 있는 경우는 없습니다 — 항상 1:N 두 쌍으로 풀린 모습으로 그려져요.

FIX ▸FK 두 개를 가진 중간 테이블을 찾으세요 — order_items 처럼 양쪽 부모 사이에 끼어 있으면 N:M 신호입니다.

부모-자식(4-2)에 관계의 세 종류(4-3)까지 — 이제 관계를 읽는 눈은 갖췄습니다. 다음 강의는 4-4 외래키(FK)와 데이터 무결성 — 이 부모-자식 관계를 DB 가 어떻게 강제하는지 봅니다. 그 전에, 식별 질문이 손에 익었는지 연습 문제로 확인하고 가세요.

NEXT LESSON4-3 연습 문제

처음 보는 도메인에도 식별 질문을 던져 1:1 / 1:N / N:M 을 판별해봅니다.

GO ▸ 연습 문제 풀기