Ch2. 데이터모델과 SQL
헷갈리는 개념 정리
2.1. 정규화
DB 최적화(튜닝) : 이상현상 발생 → 정규화 → 반정규화
- 이상현상 : 의도치 않게 데이터 일관성이 깨지는 현상
- 정규화
- 방법 : 이상현상을 방지하기 위해, 데이터 중복 최소화 및 잘 조직된 상태로 분해
- 장점 : 이를 통해 INSERT/UPDATE/DELETE (쓰기)성능은 올라가지만,
- 단점 : 많은 조인 발생으로 인해 SELCET (조회)성능이 떨어짐
- 반정규화
- 정규화를 완료한 후, 특정 조회(SELECT) 성능이 너무 느린 것이 확인될 때 어쩔 수 없이 의도적으로 테이블 통합 / 중복 데이터 추가
- 장점 : 조인 감소로 SELECT (조회)성능 향상
- 단점 : 그러나, 정규화의 장점은 포기해야함. 데이터 불일치 위험, 쓰기 성능 저하
⚠️ “정규화를 먼저 완벽하게 하고, 꼭 필요한 곳에만 반정규화를 적용해라”
정규화가 항상 SELECT(조회)성능을 떨어뜨리는 건 아니다. 테이블이 깔끔하게 정리되면 인덱스(Index)도 효율적으로 작동해서 조회 성능이 올라가기도 한다.
오히려 정규화가 잘 되어 있지 않으면 불필요한 트랜잭션이 발생하는 등 전체적인 시스템 성능이 떨어질 수 있다. 예를 들어, 학생 1명이 번호 바꾸는데 3군데를 고쳐야 하는 “불필요한 트랜잭션(수정 작업)” 때문에, 조회(읽기)가 아니라 수정/입력(쓰기) 작업에서 시스템 전체가 마비될 수 있다는 뜻이다
따라서 반정규화를 통한 성능향상은 반드시 잘 되어있는 정규화를 전제로 한다. 즉, 반정규화는 지저분한 비정규화 상태를 말하는 게 아니라, 깔끔한 정규화 상태에서 특정 조회 속도 향상이라는 명확한 목적을 가지고 의도적으로 중복을 허용하는 전략
DB 이상현상 (Anomaly)
정규화되지 않은 테이블에 INSERT/UPDATE/DELETE(쓰기)를 하면 데이터 일관성이 깨질 수 있는데 이런 현상을 데이터베이스 이상현상이라고 한다.
- 삽입이상 : 테이블에 데이터 삽입할 때, 의도치 않은 정보까지 삽입됨
- 갱신이상 : 중복저장되어 있는 데이터 중 하나만 갱신하고, 다른 하나는 갱신하지 못함
- 삭제이상 : 테이블에 데이터 삭제할 때, 의도치 않은 정보까지 삭제됨
정규화 절차
| 정규화 절차 | 설명 |
|---|---|
| 제 1정규화 | 릴레이션 속성값이 모두 원자값으로만 이루어져야 한다 - 중복값 제거 - PK 설정 |
| 제 2정규화 | PK가 복합식별자(2개 이상 조합)일 경우, 부분 함수 종속성 제거함 |
| 제 3정규화 | 일반 속성간 이행적 함수 종속성 제거함 |
| BCNF | PK제외 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해함 |
2.1.1. 제 1정규화 : 테이블의 모든 속성값이 원자값을 갖도록 한다.
문제 상황
-
속성이 여러개의 속성값을 가진다
학번(PK) 이름 수강과목 1001 홍길동 “SQL, 데이터모델링” 1002 김철수 “JAVA” -
유사한 속성이 반복된다
학번(PK) 이름 과목1 과목2 과목3 1001 홍길동 “SQL” “데이터모델링” NULL 1002 김철수 “JAVA” NULL NULL
해결책
-
속성이 여러개의 속성값을 가진다 ➡️ 해당 속성을 별도의 행(Row)으로 분리한다
학번(PK) 이름 수강과목 1001 홍길동 “SQL” 1001 홍길동 “데이터모델링” 1002 김철수 “JAVA” -
유사한 속성이 반복된다 ➡️ 반복되는 속성 그룹을 별도의 테이블로 분리하고, 기존 테이블의 PK를 새 테이블의 FK로 참조한다.
- 반복되는 속성 제거 (ex. 과목1, 과목2, …)
- → 새로운 테이블 생성(ex. 수강과목)
- → 새 테이블에 기존 테이블의 PK를 FK로 포함시키고, 반복되던 속성을 컬럼으로 추가함 (ex. 과목1, 과목2, … ➡️ 과목명)
[학생]
| 학번(PK) | 이름 |
|---|---|
| 1001 | 홍길동 |
| 1002 | 김철수 |
[수강과목]
| 학번(FK) | 과목명 |
|---|---|
| 1001 | “SQL” |
| 1001 | “데이터모델링” |
| 1002 | “JAVA” |
제 1정규화 이후의 상태 (제 1정규형)
- 모든 속성이 하나의 속성값을 가진다 (원자값)
-
유사한 속성이 반복되지 않는다 (유사한 속성? 1:M관계)
새로운 속성을 추가하면 매번 테이블 구조 변경해야한다
- 속성의 원자성이 확보되었다
-
PK에 대해 일반속성은 1:1 관계를 갖는다
| 학번(PK) | 이름 | 과목1 | 과목2 | 과목3 | | — | — | — | — | — | | 1001 | 홍길동 | “SQL” | “데이터모델링” | NULL | | 1002 | 김철수 | “JAVA” | NULL | NULL |
[학번](1)은 ‘SQL’, ‘데이터모델링’ (M)이라는 여러 값을 가지지 않아야한다.
댓글남기기