SQL 개발자 (SQLD) 데이터 모델과 SQL 개념 정리
중요도 ★★★★☆ · 45% (추정)
개요
이 단원은 데이터 모델이 실제 SQL 과 어떻게 이어지는지를 배웁니다. 정규화와 반정규화로 테이블을 나누고 합치는 원리를 먼저 익히고, 관계가 조인으로 바뀌는 방식, 트랜잭션을 모델에 표현하는 방법, NULL 의 성질, 본질식별자와 인조식별자를 차례로 공부합니다.
정규화는 중복을 없애 입력·수정·삭제 이상을 줄이는 작업입니다. 제1정규형은 모든 칸에 값이 하나씩 들어간 상태, 제2정규형은 주식별자 일부에만 종속된 속성을 떼어 낸 상태, 제3정규형은 일반 속성끼리의 종속(이행 함수 종속)을 떼어 낸 상태, BCNF 는 모든 결정자가 후보키인 상태입니다. 반대로 반정규화는 조회 성능을 위해 일부러 중복을 허용하는 것으로, 무결성이 깨질 위험이 있어 다른 방법을 먼저 검토합니다.
모델의 관계는 테이블에서 부모의 기본키와 자식의 외래키로 만들어지며, 조인할 때 이 둘을 같게 비교합니다. 하나의 트랜잭션으로 함께 저장되어야 하는 엔터티는 서로 필수 관계로 표현합니다. NULL 은 '모르는 값'이라 산술 연산 결과는 NULL, 비교 결과는 '알 수 없음'이 되고, 집계 함수는 NULL 을 빼고 계산합니다.
식별자는 업무에서 자연스럽게 생기는 본질식별자와, 복잡한 식별자를 대신해 일련번호처럼 만든 인조식별자로 나뉩니다. 인조식별자는 키가 단순해지지만 같은 데이터가 중복 입력될 수 있고, 이를 막기 위해 인덱스가 더 필요할 수 있습니다.
핵심 개념
함수 종속
A 값을 알면 B 값이 하나로 정해질 때 A → B 로 쓰고, A 를 결정자, B 를 종속자라고 합니다. 예를 들어 학번을 알면 이름이 정해지므로 학번 → 이름입니다.
외우는 요령화살표 왼쪽이 결정자, 오른쪽이 종속자입니다.
정규형 단계
제1정규형은 원자값(한 칸에 값 하나), 제2정규형은 부분 함수 종속 제거, 제3정규형은 이행 함수 종속 제거, BCNF 는 모든 결정자를 후보키로 만드는 단계입니다.
외우는 요령'원자값 → 부분 → 이행 → 결정자' 순서로 외우세요.
부분·이행 함수 종속
부분 함수 종속은 복합 주식별자의 일부(예: 과목코드)만으로 다른 속성(과목명)이 정해지는 것이고, 이행 함수 종속은 A → B, B → C 처럼 일반 속성 B 가 C 를 정하는 것입니다.
외우는 요령복합키 일부가 범인이면 제2정규형, 일반 속성이 범인이면 제3정규형 위반입니다.
반정규화
조회 성능을 높이려고 정규화된 모델에 일부러 중복을 넣는 작업입니다. 테이블 병합·분할, 중복 컬럼·파생 컬럼 추가 등이 있으며, 무결성이 깨질 위험이 있어 인덱스·뷰·클러스터링 같은 방법을 먼저 검토합니다.
외우는 요령'성능은 오르고 무결성 위험도 오른다'로 기억하세요.
NULL 의 성질
NULL 은 값이 없거나 모르는 상태로, 0 이나 공백과 다릅니다. NULL 이 들어간 산술 연산 결과는 NULL, 비교 연산 결과는 '알 수 없음'이며, SUM·AVG·COUNT(컬럼) 같은 집계 함수는 NULL 을 빼고 계산합니다.
외우는 요령AVG 는 NULL 행을 빼고 나누므로, NULL 을 0 으로 보고 나눈 값과 다릅니다.
본질식별자와 인조식별자
본질식별자는 업무 흐름에서 자연스럽게 만들어진 식별자이고, 인조식별자는 원래 식별자가 복잡해 일련번호처럼 인위적으로 만든 식별자입니다. 인조식별자는 같은 데이터가 중복으로 들어갈 수 있고 인덱스가 늘어날 수 있다는 단점이 있습니다.
외우는 요령인조식별자의 단점 '중복 데이터, 불필요한 인덱스'가 자주 나옵니다.
자주 나오는 포인트
- 주어진 종속 관계를 보고 몇 정규형을 위반하는지 고르는 문제가 자주 나옵니다.
- 정규화는 이상 현상을 줄이지만 조인이 늘어날 수 있다는 점을 기억하세요.
- NULL 이 섞인 COUNT(*)·COUNT(컬럼)·AVG 결과를 계산하는 문제가 많습니다.
- 함께 처리되어야 하는 트랜잭션은 필수(Mandatory) 관계로 표현합니다.
- 인조식별자를 쓰면 중복 데이터가 생길 수 있다는 단점을 묻습니다.
헷갈리는 것 비교: 정규형 단계별로 없애는 것
| 단계 | 없애는 것 | 예 |
|---|---|---|
| 제1정규형 | 한 칸에 여러 값(반복 그룹) | 자격증 칸에 여러 자격증 |
| 제2정규형 | 부분 함수 종속 | (학번, 과목코드)에서 과목코드 → 과목명 |
| 제3정규형 | 이행 함수 종속 | 사원번호 → 부서번호 → 부서명 |
| BCNF | 후보키가 아닌 결정자 | 결정자가 후보키가 아닌 종속 |
대표 문제 3개
검수를 마친 예상문제 가운데 이 단원의 대표 문제입니다.
문제 1. 테이블의 모든 속성이 더 이상 나눌 수 없는 하나의 값(원자값)만 가지도록 만드는 정규화 단계는?
- ① 제2정규형
- ② 제3정규형
- ③ BCNF
- ④ 제1정규형
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ④ 제1정규형
핵심: 1정규형=원자값, 2정규형=부분 종속 제거, 3정규형=이행 종속 제거
정규화 단계는 순서대로 외우면 쉽습니다.
- 제1정규형: 한 칸에 값이 하나(원자값). 반복되는 값을 없앤다
- 제2정규형: 주식별자의 일부에만 종속된 속성(부분 함수 종속)을 없앤다
- 제3정규형: 주식별자가 아닌 속성끼리의 종속(이행 함수 종속)을 없앤다
- BCNF: 모든 결정자가 후보키가 되게 한다
틀린 선지
- 제2정규형: 부분 함수 종속을 없애는 단계로, 원자값은 그 전에 이미 만족해야 합니다.
- 제3정규형: 이행 함수 종속을 없애는 단계입니다.
- BCNF: 결정자가 모두 후보키가 되도록 하는 단계입니다.
문제 2. 복합 주식별자를 가진 테이블에서, 주식별자의 일부에만 종속된 속성(부분 함수 종속)을 분리하는 정규화 단계는?
- ① 제1정규형
- ② 제3정규형
- ③ 제2정규형
- ④ 제4정규형
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ③ 제2정규형
핵심: 부분 함수 종속 제거 = 제2정규형
제2정규형은 주식별자 전체가 아니라 일부에만 종속된 속성을 다른 테이블로 떼어 내는 단계입니다. 예를 들어 주식별자가 (학번, 과목코드)인데 과목명이 과목코드만으로 정해지면, 과목명을 과목 테이블로 분리합니다.
틀린 선지
- 제1정규형: 원자값(한 칸에 값 하나)을 만드는 단계입니다.
- 제3정규형: 일반 속성끼리의 종속(이행 함수 종속)을 없애는 단계입니다.
- 제4정규형: 다치 종속을 없애는 단계로, 부분 함수 종속과는 다릅니다.
문제 3. 다음 테이블은 제2정규형까지 만족한다. 이 테이블이 만족하지 못하는 정규형으로 가장 알맞은 것은? 사원(사원번호, 사원명, 부서번호, 부서명) - 주식별자: 사원번호 - 사원번호 → 부서번호, 부서번호 → 부서명
- ① 제3정규형
- ② 제1정규형
- ③ 제2정규형
- ④ 반정규형
▼ 정답과 해설 보기▲ 정답과 해설 접기
정답: ① 제3정규형
핵심: A→B, B→C 처럼 일반 속성끼리 종속되면 제3정규형 위반
사원번호가 부서번호를 정하고, 부서번호가 다시 부서명을 정합니다(사원번호 → 부서번호 → 부서명). 이렇게 주식별자가 아닌 속성(부서번호)이 다른 속성(부서명)을 정하는 것을 이행 함수 종속이라 하며, 이것을 없애야 제3정규형이 됩니다. 부서(부서번호, 부서명) 테이블을 따로 만들면 해결됩니다.
틀린 선지
- 제1정규형: 모든 칸에 값이 하나씩이라 이미 만족합니다.
- 제2정규형: 문제에서 이미 만족한다고 했고, 주식별자가 사원번호 하나라 부분 함수 종속이 생길 수 없습니다.
- 반정규형: 정규형의 한 단계가 아니라, 성능을 위해 일부러 중복을 허용하는 반정규화를 떠올리게 하는 말입니다.
AI 작성 · 검수 완료 · AI가 새로 쓴 글 가운데, 작성과 분리된 AI 검증(다시 읽고 사실·수치 확인)을 통과한 단원만 싣습니다. 틀린 곳을 발견하면 알려 주세요.