정규화란?
- 관계형 데이터베이스의 설계에서 중복을 최소화하도록 데이터를 구조화하는 프로세스
- = 속성들 간의 종속 관계를 분석하여 여러개의 관계(Relation)로 데이터를 분해하는 것
- 무결성(Integrity)을 유지할 수 있으며, DB 저장용량을 줄일 수 있음
정규화 목표
- 불필요한 중복 최소화
- 각종 이상 현상 방지
- 다양한 관점에서 Query 지원
- 무결성 제약조건 시행 간소화
- 데이터 베이스 구조 확장시 재디자인 최소화
💡 이상 현상 (Anomaly) 이란?
: 테이블 내 불필요한 데이터 중복으로 인해,
테이블을 조작할 때 발생되는 데이터 불일치 현상
▶ 삽입 이상 (insertion anomalies)
: 원치 않는 데이터가 삽입되거나,
삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점
▶ 삭제 이상 (deletion anomalies)
: 하나의 데이터만 삭제하고 싶지만,
그 데이터가 포함된 튜플 전체가 삭제되어 원치 않는 정보 손실이 발생하는 문제점
▶ 갱신 이상 (modification anomalies)
: 중복된 튜플 중 일부만 변경하여 데이터가 불일치하는 모순이 발생하는 문제점
제 1 정규화 (1NF)
- 모든 속성들의 도메인이 원자적이도록 테이블을 분해
- 비원자적 속성은 데이터의 중복과 저장시 여러 문제를 발생
💡원자적(atomic) 이란?
: 속성의 도메인이 더 이상 분해되지 않는 것
1NF 적용 전
"수강 과목" 속성이 1NF를 만족하지 못한다.
학번 | 이름 | 수강과목 |
20191111 | 김민수 | DB, Network |
20201111 | 김철수 | DB |
20211111 | 박민지 | OS, Network |
20221111 | 이민지 | OS, DB |
1NF 적용 후
따라서 1NF를 만족하도록 아래와 같이 수정을 해준다.
학번 | 이름 | 수강과목 |
20191111 | 김민수 | DB |
20191111 | 김민수 | Network |
20201111 | 김철수 | DB |
20211111 | 박민지 | OS |
20211111 | 박민지 | Network |
20221111 | 이민지 | OS |
20221111 | 이민지 | DB |
제 2 정규화 (2NF)
- 제 1 정규화를 만족
- 완전 함수 종속을 만족하도록 테이블을 분해 (부분 함수 종속 제거)
💡 종속 이란?
: 기본 키의 부분집합이 결정자가 되어서는 안됨을 의미
2NF 적용 전
다음과 같은 테이블에서 기본키는 {학번, 수강과목} 으로 복합키 이다.
그런데, 기본 키의 부분집합인 "수강과목"이 "지도교수"의 결정자가 되고 있다.
{학번, 수강과목} (결정자) → {지도교수, 학점}(종속자)
수강과목(결정자) → 지도교수(종속자)
학번 | 수강과목 | 지도교수 | 학점 |
20191111 | DB | 이용호 | A |
20191111 | Network | 이길석 | A |
20201111 | DB | 이용호 | B |
20211111 | OS | 강기태 | B |
20211111 | Network | 이길석 | B+ |
20221111 | OS | 강기태 | C |
20221111 | DB | 이용호 | A+ |
2NF 적용 후
따라서 2NF를 만족하도록 다음과 같이 테이블을 분리해 준다.
학번 | 수강과목 | 학점 |
20191111 | DB | A |
20191111 | Network | A |
20201111 | DB | B |
20211111 | OS | B |
20211111 | Network | B+ |
20221111 | OS | C |
20221111 | DB | A+ |
수강과목 | 지도교수 |
DB | 이용호 |
Network | 이길석 |
OS | 강기태 |
제 3 정규화 (3NF)
- 제 2 정규화를 만족
- 이행적 종속을 없애도록 테이블을 분해
- BCNF 보다는 약하지만, 종속성을 보존하도록 해줌
💡 이행적 종속이란?
: A → B , B → C에 의해서 추론될 수 있는 A→ C 의 종속관계
즉, 비주요 속성이 비주요 속성에 의해 종속되는 경우가 없는 릴레이션 형태
💡 이행적 종속 제거가 필요한 이유
: 아래 테이블에서 수강과목이 바뀌면, 수강료도 바뀌어야한다!
이 작업이 번거로울 수도 있고, 실수가 발생할 수도 있으므로
때문에 갱신 이상이 생기지 않도록, 별도의 테이블로 분리해준다!
3NF 적용 전
한 학생이 한 과목만 듣는다고 가정해보자.
학번 → 수강 과목 / 수강과목 → 수강료
이 경우, 학번 → 수강료를 결정한다.
학번 | 수강과목 | 수강료 |
20191111 | DB | 100,000 |
20201111 | DB | 100,000 |
20211111 | OS | 90,000 |
20221111 | Network | 80,000 |
3NF 적용 후
따라서 다음과 같이 분해해주어야 한다.
학번 | 수강과목 |
20191111 | DB |
20201111 | DB |
20211111 | OS |
20221111 | Network |
수강과목 | 수강료 |
DB | 100,000 |
OS | 90,000 |
Network | 80,000 |
BCNF (Boyce-Codd Normal Form)
- 제 3 정규화 만족
- 모든 결정자가 후보키 집합에 속하도록 테이블 분해
( = 후보키에 속하지 않는 속성이 결정자가 되어서는 안됨)
💡 수많은 정규형이 있지만,
관계 데이터베이스 설계의 목표는
각 릴레이션이 3NF(or BCNF)를 갖게 하는 것!
BCNF 적용 전
기본키 {학번, 수강과목} 으로 , 지도교수를 알 수 있다.
하지만, 같은 과목을 다른 교수가 가르칠 수 도 있기 때문에,
수강과목 → 지도교수 종속은 성립하지 않는다.
하지만 지도 교수가 어떤 과목을 가르치는지는 알 수 있으므로,
지도교수 →수강과목 종속이 성립한다.
이처럼 후보키 집합이 아닌 속성이 결정자가 되어버리는 상황을
BCNF를 만족하지 않는다고 한다!
학번 | 수강과목 | 지도교수 |
20191111 | DB | 이용호 |
20191111 | Network | 이길석 |
20201111 | DB | 김용호 |
20211111 | OS | 강기태 |
20211111 | Network | 이길석 |
20221111 | OS | 강기태 |
20221111 | DB | 이용호 |
BCNF 적용 후
학번 | 지도교수 |
20191111 | 이용호 |
20191111 | 이길석 |
20201111 | 김용호 |
20211111 | 강기태 |
20211111 | 이길석 |
20221111 | 강기태 |
20221111 | 이용호 |
지도교수 | 수강과목 |
이용호 | DB |
이길석 | Network |
김용호 | DB |
강기태 | OS |
정규화 장단점
장점
- 데이터베이스 변경 시 이상 현상(Anomaly) 해결 가능
- 데이터베이스 구조 확장 시 재디자인 최소화 가능
- 사용자에게 데이터 모델을 더욱 의미있게 제공
💡 정규화된 테이블들과 정규화된 테이블들간의 관계들은
현실 세계에서의 개념들과 그들간의 관계들을 반영 !
단점
- 릴레이션 분해로 인한 JOIN 연산 증가 (이로 인해 처리 속도가 빨라질 수도, 느려질 수도 있음)
- 이로 인해, 성능 저하가 나타나는 경우, 반정규화를 적용할 필요가 있음
💡 반정규화 (De-normalization, 비정규화) 란?
: 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해
중복 통합, 분리 등을 수행하는 데이터 모델링 기법
💡 반정규화 대상
- 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
- 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
- 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우
💡 반정규화 시 주의할 점
: 반정규화를 과도하게 적용하다보면, 데이터의 무결성이 깨질 수 있음
또한, CRUD에 대한 응답 시간이 늦어질 수도 있음
'CS > 데이터베이스' 카테고리의 다른 글
식별관계 비식별관계 (0) | 2023.04.17 |
---|---|
Index, View, Transaction (인덱스, 뷰, 트랜잭션) (0) | 2023.04.12 |
Key (후보키, 기본키, 슈퍼키, 대체키, 외래키) (0) | 2023.04.12 |
MySQL 정리 (0) | 2023.02.13 |
DBMS (데이터베이스 관리 시스템) (0) | 2023.01.12 |