4-3 연습 문제 — 1:1 / 1:N / N:M,
양쪽으로 물어봐야 관계가 보인다
이번 강의에서 배운 것 — "한 X 가 여러 Y? 반대도?" 질문으로 세 관계를 식별하는 법. 눈으로 읽고 끝내면 머리에 남지 않습니다. 시나리오마다 질문 두 개를 직접 양쪽으로 던져보고, 본인 답을 적어 본 다음에 정답을 여세요.
섹션 4 에서의 위치
완료 ✓
강의 완료 ✓
지금 여기
관계를 지키는 장치
ERD · 정규화 · 모델링 실전
2-4에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 막히면 정답이 아니라 힌트만 요청하고, 다 푼 뒤에는 본인 답을 AI 에 던지며 “이 관계 분류가 맞아?” 라고 검증을 요청하세요. 관계 식별은 정답표 암기가 아니라 — 질문 두 개를 던지는 사고 습관입니다.
문제 1. 실무 시나리오 관계 종류 판단
다음 시나리오에서 — 두 대상이 어떤 관계인지 (1:1 / 1:N / N:M) 판단하세요.
| # | 시나리오 | 관계? |
|---|---|---|
| A | 게시글 ↔ 댓글 | ? |
| B | 회원 ↔ 회원 (팔로우) | ? |
| C | 학생 ↔ 학교 (재학) | ? |
| D | 회원 ↔ 신용카드 | ? |
| E | 책 ↔ 저자 | ? |
정답 보기
| # | 시나리오 | 관계 | 설명 |
|---|---|---|---|
| A | 게시글 ↔ 댓글 | 1:N | 게시글 1개에 댓글 여러개, 댓글은 게시글 하나에만 속함 |
| B | 회원 ↔ 회원 (팔로우) | N:M | 한 명이 여러 명 팔로우 + 한 명이 여러 명에게 팔로우당함. 자기참조 N:M. 중간 테이블 follows 필요 |
| C | 학생 ↔ 학교 | N:1 (=1:N 의 반대) | 학생 여러 명이 한 학교에 속함. 학생 → 학교 는 1:1 처럼 보이지만, 학교 → 학생 으로 보면 1:N |
| D | 회원 ↔ 신용카드 | 1:N | 한 회원이 여러 카드 등록 가능 (가능한 경우) |
| E | 책 ↔ 저자 | N:M | 한 책에 여러 저자 가능 (공저), 한 저자가 여러 책 씀. 중간 테이블 book_authors 필요 |
핵심: 질문 두 개를 양쪽 모두 던지는 게 핵심.
문제 2. shop 의 N:M 이 어떻게 풀려있나
shop 에서 — 주문(orders) 과 상품(products) 의 N:M 관계가 어떻게 풀려있는지 설명하세요. 어느 테이블이 중간 테이블이고, 어떻게 1:N + N:1 두 쌍으로 분해됐는지.
정답 보기
order_items 가 중간 테이블 — 주문 ↔ 상품의 N:M 을 풀어줌.
| 원래 N:M | 분해된 두 1:N |
|---|---|
orders ↔ products | orders (1) : order_items (N) — 한 주문에 여러 주문상세 |
products (1) : order_items (N) — 한 상품이 여러 주문상세에 |
중간 테이블의 의미: order_items 는 “누가, 어떤 상품을, 몇 개 샀냐” 라는 교차 정보 를 담음. 단순 ID 두 개 뿐 아니라 quantity 같은 추가 컬럼도 가짐 — 이게 중간 테이블의 진가.
문제 3 (도전). “태그 기능” 을 shop 에 추가한다면
shop 에 — “상품에 태그를 달 수 있는 기능” 을 추가한다고 합시다. 예: “세일”, “신상품”, “베스트셀러” 등.
1) 상품 ↔ 태그는 어떤 관계? 2) 어떤 테이블을 추가해야 하나? 3) 그 테이블의 PK 와 FK 는?
한 상품에 여러 태그, 한 태그가 여러 상품에 달릴 수 있음.
정답 보기
1) 관계: N:M
- 한 상품 → 여러 태그 (예: “신상품” + “세일” 동시 가능)
- 한 태그 → 여러 상품 (“세일” 태그가 50개 상품에 달림)
2) 추가할 테이블 2 개
tags(태그 마스터): tag_id PK, tag_nameproduct_tags(중간 테이블): product_id FK, tag_id FK
3) ERD
product_tags 의 PK 는 복합키 (product_id, tag_id) — 한 상품에 같은 태그가 두 번 달리지 않게.
모범 SQL — 신상품 태그 달린 상품 찾기:
SELECT
p.product_name
FROM
products p
JOIN product_tags pt
ON p.product_id = pt.product_id
JOIN tags t
ON pt.tag_id = t.tag_id
WHERE
t.tag_name = '신상품';AI 에 이 ERD 와 함께 “베스트셀러 태그 + 의류 카테고리 상품” 같은 복합 쿼리도 던져보세요.
다 풀었다면 — AI 검증 루틴까지
관계 판별 질문 양쪽으로 던지기 · 중간 테이블 찾기 · N:M 직접 설계 — 세 문제를 본인 답으로 먼저 적어봤다면, 어떤 시나리오를 만나도 관계 종류가 보이기 시작합니다. 마지막 한 걸음 — 본인 답을 AI 선생님에게 검증받는 것 까지 해야 진짜 끝입니다.
관계를 식별했으면 다음 질문은 하나 — 이 관계를 DB 가 스스로 지키게 만들 수는 없을까? 그 장치가 바로 외래키(FK)입니다.