바이브 코딩 시대의 데이터베이스3-4 연습 문제
테크타니 LEARN — 섹션 03 · 연습 문제

3-4 연습 문제 — 이 행을
정확히 가리킬 수 있나요

이번 강의에서 배운 것 — 중복 불가 · NULL 불가, 그리고 기본키는 하나지만 그걸 구성하는 컬럼은 1개일 수도 N개일 수도 있다는 것. 오늘도 SQL은 쓰지 않습니다. 대신 후보를 직접 고르고, 저장이 될지 안 될지 판정해 보세요.

문제3문제 (도전 1 포함)권장 소요12분사용 테이블members · orders · order_items준비물없음 — 스키마만 읽으면 OK

섹션 3 에서의 위치

3-3 데이터 타입

완료 ✓

3-4 기본키(PK)

강의 완료 ✓

3-4 연습 문제

지금 여기

3-5 외래키(FK)

테이블 사이를 잇는 값

AI 과외 선생님 활용법

2-4에서 만든 AI 과외 선생님 세션을 그대로 쓰세요. 기본키 문제는 “정답이 무엇인가” 보다 판단 기준이 중요합니다 — “이메일을 기본키로 쓰면 안 되는 이유를 중복·NULL 두 규칙으로 설명해줘” 처럼 물어보세요. 다 푼 뒤에는 본인의 근거를 적어 검증받는 게 가장 남습니다.

문제 1. 이 컬럼, 기본키로 써도 될까요

회원 테이블을 새로 만들면서 기본키 후보 네 개를 놓고 고민 중입니다. 각각 기본키로 적절한지 판단하고 이유를 붙여보세요.

기본키 후보 4개
#후보 컬럼값 예시
member_name — 회원 이름김철수
phone — 휴대폰 번호010-1234-5678
email — 이메일 주소chulsoo@example.com
member_id — 회원 번호1
힌트

두 가지만 물어보세요 — “이 값이 두 사람에게 똑같이 들어갈 수 있나?” 그리고 “이 값이 비어 있거나, 나중에 바뀔 수 있나?” 기본키의 두 규칙이 그대로 판단 기준입니다.

정답 보기

member_name — 기본키로 부적절 ❌

동명이인이 언제든 생길 수 있습니다. 중복 불가 규칙을 지킬 수 없어요. 개명하면 값이 바뀐다는 것도 문제고요.

여기서 중요한 감각 하나 — 실제 shop 의 회원 20명에는 동명이인이 없습니다. 하지만 “지금 중복이 없다”“앞으로도 중복될 수 없다” 는 완전히 다른 말입니다. 기본키는 뒤쪽이어야 해요.

phone — 기본키로 부적절 ❌

번호를 바꾸는 사람도 있고, 해지한 번호는 다른 사람에게 다시 배정되기도 합니다. 게다가 아직 번호를 등록하지 않은 회원은 값이 비게 되죠 — NULL 불가 규칙에 걸립니다.

email — 기본키로 권하지 않음 △

중복이 잘 생기지 않는 편이라 ①·②보다는 낫습니다. 다만 이메일을 적지 않은 회원은 NULL 이 되고, 이메일을 바꾸는 사람도 있어요. 실무에서는 이메일에 중복만 막는 규칙을 따로 걸어두고, 기본키는 별도의 번호로 두는 편입니다.

member_id — 기본키로 적절 ✓

그 자체로는 아무 뜻이 없는 번호라서 바뀔 이유가 없습니다. 새 회원이 생길 때마다 새 번호를 붙이면 중복도 나지 않고, 비워둘 일도 없어요. 실제 shop 스키마가 정확히 이렇게 되어 있습니다 — PRIMARY KEY (member_id).

가상 예시입니다

phoneemail 컬럼은 실제 shop 스키마에 없습니다. 기본키 후보를 비교하기 위한 가상의 컬럼이에요. 실제 members 의 컬럼은 member_id · member_name · gender · age · joined_at 다섯 개입니다.

문제 2. 이 저장 시도는 성공할까요, 실패할까요

실제 members 테이블입니다. member_id가 기본키이고, 이미 1번부터 20번까지 저장돼 있어요. 여기에 새 회원을 저장하는 시도가 네 번 있었습니다.

문제 조건

이 문제에서는 member_id 의 자동 번호 매기기(AUTO_INCREMENT)를 잠시 꺼두고, 번호를 직접 지정해서 저장하는 상황이라고 가정합니다.

네 번의 저장 시도
#member_id 에 넣은 값무엇을 하려는 시도인가
21새 회원 '정하늘' 을 21번으로 저장
3새 회원 '한지우' 를 3번으로 저장
(비움 · NULL)새 회원 '최유리' 를 번호 없이 저장
22새 회원 '김철수' 를 22번으로 저장 (1번 회원과 이름이 완전히 같음)
정답 보기
#결과이유
저장 성공21번은 아직 아무도 쓰지 않은 값입니다
저장 실패3번은 이미 박민수가 쓰고 있습니다 — 중복 불가 위반
저장 실패기본키는 비울 수 없습니다 — NULL 불가 위반
저장 성공이름이 같아도 상관없습니다 — 기본키가 보는 건 member_id

④가 오늘의 핵심입니다. 기본키는 “행 전체가 다른가” 를 검사하지 않습니다. 지정된 기본키 컬럼의 값만 봅니다.

그래서 22번 김철수와 1번 김철수는 이름이 똑같아도 서로 다른 행으로 나란히 저장됩니다. 그리고 나중에 둘 중 하나를 고쳐야 할 때 — member_id 로 정확히 한 명을 집어낼 수 있죠. 강의를 시작하며 던졌던 바로 그 문제가 이렇게 풀립니다.

참고 — 실제 members 는 AUTO_INCREMENT 입니다

실제 shopmember_idAUTO_INCREMENT 라서, 번호를 생략하면 데이터베이스가 다음 번호를 알아서 붙여줍니다. 그래서 현실에서는 ③처럼 번호를 직접 비우는 일이 거의 없어요. 이건 데이터베이스가 값을 만들어주는 것이지 기본키에 NULL 이 저장되는 게 아닙니다 — 두 규칙은 그대로입니다.

문제 3 (도전). order_id 하나로는 왜 부족할까요

order_items 테이블의 앞부분입니다. 실제 shop 데이터예요.

shop DB — order_items 앞부분
order_idproduct_idquantity
111
1162
2221
391
3111
전체 64줄 중 앞의 5줄

세 가지에 답하세요.

  1. order_id 하나만으로는 기본키가 될 수 없습니다. 위 데이터의 실제 값을 근거로 이유를 설명하세요.
  2. 그렇다면 product_id 하나만으로는 어떨까요? 역시 실제 데이터로 논증하세요.
  3. 어떤 수강생이 이렇게 말했습니다 — order_items 는 기본키가 order_idproduct_id 두 개다.” 이 문장의 어디가 틀렸는지 바로잡아 설명하세요.
힌트

중복 불가 규칙을 그대로 대입해 보세요 — “이 컬럼의 값이 두 행에 똑같이 들어 있는 경우가 실제로 있나?” 한 건이라도 있으면 그 컬럼은 단독으로 기본키가 될 수 없습니다.

정답 보기

1. order_id 단독으로는 불가 — 값이 실제로 중복됩니다

1번 주문 한 건에 (1, 1)(1, 16) 두 행이 있습니다. order_id1두 행에 똑같이 들어 있죠. 중복 불가 규칙 위반입니다.

3번 주문도 마찬가지예요 — (3, 9)(3, 11). 한 주문에 상품을 여러 개 담는 순간 order_id 는 반복될 수밖에 없습니다.

2. product_id 단독으로도 불가 — 같은 상품이 여러 주문에 들어갑니다

무선 이어폰(product_id 9)은 3번 주문에도 있고, 6번과 12번 주문에도 들어 있습니다. product_id9 가 여러 행에 반복되니 역시 중복 불가 위반이에요.

두 컬럼을 각각 단독으로 놓고 보면
기준중복되는 실제 값단독 PK 가능?
order_id1 → (1,1)·(1,16) / 3 → (3,9)·(3,11)불가 ❌
product_id9 → 3번·6번·12번 주문에 모두 등장불가 ❌
(order_id, product_id)중복되는 쌍이 하나도 없음가능 ✓
한 컬럼만으로는 행이 정해지지 않지만 — 한 쌍으로 묶으면 정해집니다

3. “기본키가 두 개”라는 표현이 틀렸습니다

order_items기본키는 하나입니다. 그 하나를 order_idproduct_id 두 컬럼이 함께 구성하는 것이고, 이런 기본키를 복합키라고 부릅니다.

한 테이블에 기본키는 언제나 하나만 지정할 수 있어요. 달라지는 건 기본키의 개수가 아니라 — 그 하나를 만드는 컬럼의 개수입니다. 테이블 정의를 보면 더 분명합니다.

order_items 의 기본키 정의
PRIMARY KEY (order_id, product_id)
PRIMARY KEY 도 한 줄, 괄호도 하나
→ 기본키는 하나. 안에 든 컬럼이 두 개일 뿐이다.

보너스 — 이 복합키가 실제로 막아주는 것

같은 주문에 같은 상품이 두 줄로 들어갈 수 없습니다. 그래서 10번 주문은 프리미엄 그래놀라(product_id 16)를 세 개 샀지만 행은 하나예요 — (10, 16, 3). 행을 늘리는 대신 quantity 숫자를 올린 겁니다.

여기서 얻어갈 감각

“PK 가 몇 개인가” 가 아니라 “PK 하나를 몇 개의 컬럼이 만드는가” 로 묻는 습관을 들이면 — 복합키는 더 이상 헷갈리지 않습니다.

다 풀었다면

✓ 3-4 훈련 완료 기준

처음 보는 테이블에서 “이 행을 무엇으로 정확히 가리킬 수 있지?” 를 먼저 묻게 됐고, 복합키를 보고도 “기본키는 하나”라고 말할 수 있다면 오늘 목표는 달성입니다.

여유가 있다면 — DBeaver 로 직접 확인

DBeaver 좌측 트리에서 shop → Tables → members 를 더블클릭하고 Columns 탭을 열면 member_id 옆에 열쇠 표시가 붙어 있습니다. 이어서 order_items 도 열어보세요 — order_idproduct_id 둘 다 열쇠가 붙어 있죠. 기본키가 두 개라는 뜻이 아닙니다. Constraints(제약) 항목을 펼치면 PRIMARY KEY하나뿐이고 그 안에 두 컬럼이 들어 있는 걸 확인할 수 있어요. orders 도 열어서 member_id 에는 열쇠가 없다는 걸 눈으로 확인해보세요.

이제 한 행을 정확히 가리킬 수 있게 됐습니다. 그런데 ordersmember_id 는 기본키도 아닌데 왜 거기 있을까요? 그건 다른 테이블의 기본키를 가리키는 값입니다. 다음 강의에서 테이블과 테이블을 잇는 이 값을 다룹니다.

NEXT LESSON3-5 외래키(FK) — 테이블 사이를 연결하는 값

orders.member_id 가 members.member_id 를 가리킵니다 — 흩어진 테이블이 하나의 이야기로 연결되는 지점이에요.

GO ▸ 3-5 시작하기