데이터 모델과 SQL
ERD에서 테이블, 키, 관계, 조인 조건이 어떻게 SQL로 이어지는지 정리합니다. 모델링 문제가 SQL 결과 예측 문제로 바뀌는 지점을 다룹니다.
PKFKJOINNULL 모델링과 SQL은 따로가 아닙니다
모델링은 업무 규칙을 테이블 구조로 옮기는 과정이고, SQL은 그 구조에서 데이터를 꺼내는 언어입니다. 그래서 좋은 SQL을 쓰려면 먼저 테이블 사이의 관계를 읽을 수 있어야 합니다.
예를 들어 고객, 주문, 주문상세, 상품이 있다면 보통 다음 흐름으로 연결됩니다.
고객 1명 ── 여러 주문
주문 1건 ── 여러 주문상세
상품 1개 ── 여러 주문상세
SQL에서는 이 관계가 조인 조건으로 나타납니다.
SELECT c.customer_name, p.product_name, od.quantity
FROM customer c
JOIN orders o ON o.customer_id = c.customer_id
JOIN order_detail od ON od.order_id = o.order_id
JOIN product p ON p.product_id = od.product_id;
관계 차수 읽기
| 관계 | 의미 | 테이블 설계 감각 |
|---|---|---|
| 1:1 | 한 행이 상대 테이블 한 행과만 연결 | 자주 합치거나 보안상 분리 |
| 1:N | 한 행이 상대 테이블 여러 행과 연결 | N쪽 테이블에 외래키가 들어갑니다 |
| M:N | 양쪽 모두 여러 행과 연결 | 중간 엔터티로 풀어야 합니다 |
M:N 관계는 그대로 테이블 하나의 외래키로 표현하기 어렵습니다. 학생과 과목은 한 학생이 여러 과목을 듣고, 한 과목에 여러 학생이 참여합니다. 이때 수강 같은 중간 엔터티가 필요합니다.
식별 관계와 비식별 관계
식별 관계는 부모의 키가 자식의 기본키 일부가 되는 관계입니다. 자식이 부모 없이는 식별될 수 없을 때 사용합니다.
주문(주문번호)
주문상세(주문번호, 순번)
주문상세의 기본키에 주문번호가 포함된다면 식별 관계로 볼 수 있습니다. 반대로 부모 키가 자식의 일반 외래키로만 들어가면 비식별 관계입니다.
시험에서는 “자식 엔터티의 주 식별자에 부모 식별자가 포함되는가”를 기준으로 판단하면 됩니다.
정규화가 SQL에 주는 영향
정규화는 중복을 줄이고 이상 현상을 막지만, 조회할 때 조인이 늘어날 수 있습니다.
| 설계 상태 | 장점 | SQL 영향 |
|---|---|---|
| 정규화 | 중복 감소, 무결성 향상 | 필요한 정보를 얻기 위해 조인이 필요 |
| 반정규화 | 조회 단순화, 성능 개선 가능 | 중복 관리와 갱신 이상 위험 증가 |
반정규화는 “무조건 나쁘다”가 아니라 성능 요구 때문에 선택할 수 있는 설계입니다. 다만 시험에서는 보통 정규화로 정확한 구조를 만든 뒤, 검증된 성능 이슈가 있을 때 반정규화를 고려한다는 순서를 기억합니다.
모델을 SQL 결과로 바꾸는 순서
- 엔터티가 어떤 테이블로 구현되는지 봅니다.
- 기본키와 외래키를 찾아 조인 조건을 만듭니다.
- 관계 차수가 1:N인지 M:N인지 확인합니다.
- 조인 후 행 수가 늘어나는 쪽을 찾습니다.
- 조건절이 어느 테이블의 행을 제거하는지 확인합니다.
자주 출제되는 유의 사항
LEFT OUTER JOIN을 했더라도 WHERE 절에서 오른쪽 테이블 컬럼에 일반 조건을 걸면 결과가 내부 조인처럼 줄어들 수 있습니다.
WHERE 조건
LEFT JOIN orders o
ON o.customer_id = c.customer_id
WHERE o.order_status = 'PAID';
주문이 없는 고객은 o.order_status가 NULL이므로 WHERE에서 제거됩니다.
ON 조건
LEFT JOIN orders o
ON o.customer_id = c.customer_id
AND o.order_status = 'PAID';
기준 테이블(고객)은 보존됩니다. 조건에 맞는 주문만 붙고, 매칭이 없으면 NULL로 남습니다.
보존하고 싶은 기준 테이블이 있다면 조건을 ON에 둘지 WHERE에 둘지 신중히 판단해야 합니다.
한 문장 요약
모델링의 관계는 SQL의 조인 조건이 되고, 관계 차수는 결과 행 수를 바꿉니다.