Lsiron
정규화와 역정규화 그리고 이상현상, 함수의 종속성 본문
정규화 (Normalization)
정의
정규화는 데이터베이스 설계 과정에서 데이터의 중복을 최소화하고 데이터의 일관성과 무결성을 유지하기 위해 테이블을 구조화하는 방법이다. 이를 통해 데이터베이스의 성능을 최적화하고, 이상 현상을 방지할 수 있다.
정규화는 여러 단계로 이루어져 있으며, 각 단계는 특정 규칙을 준수한다. 주요 정규형(Normal Form)은 다음과 같다:
- 제1정규형 (1NF: First Normal Form)
- 제2정규형 (2NF: Second Normal Form)
- 제3정규형 (3NF: Third Normal Form)
- 보이스-코드 정규형 (BCNF: Boyce-Codd Normal Form)
- 제4정규형 (4NF: Fourth Normal Form)
- 제5정규형 (5NF: Fifth Normal Form)
정규화의 역할
- 데이터 무결성 유지: 데이터의 일관성과 정확성을 유지한다.
- 데이터 중복 최소화: 데이터의 중복을 줄여 저장 공간을 절약한다.
- 데이터 이상 방지: 삽입, 갱신, 삭제 시 발생할 수 있는 이상 현상을 방지한다.
정규화를 통해 데이터베이스는 더 구조화되고 효율적으로 작동하며, 데이터의 무결성과 일관성을 보장할 수 있다.
이상 현상 (Anomalies)
이상현상이란 잘못된 데이터베이스 설계로 인해 발생하는 오류이다.
정규화되지 않은 데이터베이스에서는 다음과 같은 이상 현상이 발생할 수 있다.
- 삽입 이상 (Insertion Anomaly): 데이터를 삽입할 때 불필요한 중복 데이터를 함께 삽입해야 하는 문제.
- 예: 새로운 주문을 추가할 때 고객의 정보를 반복해서 입력해야 한다.
- 갱신 이상 (Update Anomaly): 데이터를 갱신할 때 중복된 데이터가 불일치 상태가 되는 문제.
- 예: 고객의 이메일 주소를 변경할 때 여러 테이블에 일관되게 변경해야 한다.
- 삭제 이상 (Deletion Anomaly): 데이터를 삭제할 때 원치 않는 데이터까지 함께 삭제되는 문제.
- 예: 주문을 삭제할 때 고객의 정보도 함께 삭제될 수 있다.
이러한 이상현상이 발생하는 이유는 함수의 종속성 때문이다. 그럼 함수의 종속성은 무엇일까?
함수 종속성 (Functional Dependency)
함수 종속성은 데이터베이스 관계(Relation)에서 특정 속성 집합이 다른 속성 집합을 고유하게 결정하는 관계를 의미한다.
학생 테이블 (Students)
----------------------------------------------
| 학번 (ID) | 이름 (Name) | 학과 (Department) |
----------------------------------------------
| 1 | 홍길동 | 컴퓨터공학 |
| 2 | 김철수 | 전기공학 |
| 3 | 이영희 | 기계공학 |
----------------------------------------------
기호: X -> Y 는 속성 X가 속성 Y를 함수적으로 결정한다는 것을 의미한다. 즉, X의 값이 Y의 값을 유일하게 결정한다.
( 여기서 X 를 결정자, Y 를 종속자 라고 한다.)
위 테이블에서 ID -> Name, ID -> Department는 함수 종속성이다. 즉, 학번(ID)이 주어지면 학생의 이름(Name)과 학과(Department)를 고유하게 결정할 수 있다.
정규화와 관련된 함수 종속성의 종류
데이터베이스 정규화 과정에서는 다양한 형태의 함수 종속성이 중요한 역할을 한다.
대표적인 함수 종속성의 종류는 다음과 같다.
1. 완전 함수 종속 (Full Functional Dependency)
- 정의: 속성 Y가 기본 키 X 전체에 종속되며, X의 부분 집합에는 종속되지 않는 경우.
- 예시: 테이블 Student(학번, 과목, 성적)에서 (학번, 과목) → 성적은 완전 함수 종속이다. 성적은 학번과 과목의 조합에 종속되지만, 학번이나 과목 중 하나에만 종속되지 않는다.
2. 부분 함수 종속 (Partial Functional Dependency)
- 정의: 속성 Y가 기본 키 X의 부분 집합에 종속되는 경우.
- 예시: 테이블 Student(학번, 과목, 교수)에서 학번 → 교수는 부분 함수 종속이다. 교수는 학번에 종속되지만, 학번과 과목의 조합(기본 키) 전체에는 종속되지 않는다. 이는 2NF를 위반하는 경우이다.
3. 이행 함수 종속 (Transitive Functional Dependency)
- 정의: 속성 X가 속성 Y를 결정하고, 속성 Y가 속성 Z를 결정하는 경우, X → Z가 이행 함수 종속이다.
- 예시: 테이블 Student(학번, 교수, 학과)에서 학번 → 교수, 교수 → 학과가 있을 때, 학번 → 학과는 이행 함수 종속이다. 이는 3NF를 위반하는 경우이다.
4. 결정자 (Determinant)와 종속자 (Dependent)
- 결정자 (Determinant): 다른 속성의 값을 결정하는 속성.
- 종속자 (Dependent): 결정자에 의해 결정되는 속성.
- 예시: 테이블 Employee(직원ID, 이름, 부서ID)에서 직원ID가 결정자이고, 이름과 부서ID는 종속자이다.
- 직원ID → 이름, 직원ID → 부서ID.
그럼 이제 정규형의 종류에 대해 알아보자.
보통 3차 정규화 까지 마치면 데이터가 어느정도 무결성을 보장한다고 할 수 있고 추가로 보이스-코드 정규형 까지 하는 편이다. 허나 4차와 5차 정규화는 특수한 상황일때만 하기 때문에, 보이스-코드 정규형 까지만 알아보자.
제1정규형 (1NF: First Normal Form)
정의: 모든 속성이 원자 값(더 이상 나눌 수 없는 값)을 가져야 한다.
즉, 테이블의 컬럼이 하나의 값만 갖도록 도메인을 원자값으로 설정하는 과정이다.
정규화되지 않은 테이블:
주문 ID | 고객 이름 | 주문 품목 |
1 | 홍길동 | 아이템1, 아이템2, 아이템3 |
2 | 김철수 | 아이템4, 아이템5 |
제1정규형으로 변환된 테이블:
주문 ID | 고객 이름 | 주문 품목 |
1 | 홍길동 | 아이템1 |
1 | 홍길동 | 아이템2 |
1 | 홍길동 | 아이템3 |
2 | 김철수 | 아이템4 |
2 | 김철수 | 아이템5 |
제2정규형 (2NF: Second Normal Form)
정의: 제1정규형을 만족하고, 기본 키의 모든 부분 집합에 대해 함수적 종속을 제거해야 한다.
이 말은 부분 함수 종속을 제거하고 완전 함수 종속이 되도록 테이블을 분해하는 과정이라고 할 수 있다.
즉, 이러한 이상현상의 원인이 되는 부분 함수적 종속이 없어야 한다. 이러한 부분 함수 종속이 발생하는 이유는 기본키를 구성하는 속성 중 일부가 결정자 역할을 하기 때문이다.
기본키가 복합키이거나 후보키가 결정자인 경우에 부분 함수 종속이 발생할 수 있다.
반대로 기본키를 구성하는 속성 모두가 결정자 역할을 하는 경우는 완전 함수 종속이라고 한다.
제1정규형 테이블:
주문 ID | 품목 ID | 고객 이름 |
1 | 1 | 홍길동 |
1 | 2 | 홍길동 |
2 | 3 | 김철수 |
2 | 4 | 김철수 |
제2정규형으로 변환된 테이블:
주문 테이블
주문 ID | 고객 이름 |
1 | 홍길동 |
2 | 김철수 |
주문 품목 테이블
주문 ID | 품목 ID |
1 | 1 |
1 | 2 |
2 | 3 |
2 | 4 |
제3정규형 (3NF: Third Normal Form)
정의: 제2정규형을 만족하고, 이행 함수 종속(기본 키가 아닌 컬럼이 다른 기본 키가 아닌 컬럼을 결정하지 않아야 함)을 제거하는 과정이라고 볼 수 있다.
이는 이행 함수 종속 현상 때문에 이상현상이 발생한다.
즉, X => Y, Y => Z 라는 종속관계가 있을 때, X => Z 가 성립하는 경우에 발생한다.
( X 라는 속성을 통해 Y를 알고, Y라는 속성을 통해 Z라는 속성을 알 수 있는 경우에 발생 )
제2정규형 테이블:
주문 테이블
주문 ID | 고객 ID | 고객 이름 |
1 | 1 | 홍길동 |
2 | 2 | 김철수 |
고객 테이블
고객 ID | 고객 이름 |
1 | 홍길동 |
2 | 김철수 |
제3정규형으로 변환된 테이블:
주문 테이블
주문 ID | 고객 ID |
1 | 1 |
2 | 2 |
고객 테이블
고객 ID | 고객 이름 |
1 | 홍길동 |
2 | 김철수 |
보이스-코드 정규형 (BCNF: Boyce-Codd Normal Form)
정의: 제3정규형을 만족하면서, 모든 결정자가 후보키여야 한다. 즉, 결정자이면서 후보키가 아닌 것을 제거하는 과정이다.
3NF를 만족하지만 BCNF를 만족하지 않는 테이블:
교수 ID | 과목 ID | 교수 이름 |
1 | 1 | 홍길동 |
2 | 2 | 김철수 |
1 | 3 | 홍길동 |
BCNF로 변환된 테이블:
교수 테이블
교수 ID | 교수 이름 |
1 | 홍길동 |
2 | 김철수 |
교수 과목 테이블
교수 ID | 과목 ID |
1 | 1 |
2 | 2 |
1 | 3 |
역정규화 (반정규화)
역정규화란 정규화된 데이터베이스의 성능을 개선하기 위해 다시 통합하여 구조를 재구성 하는 것.
무조건 정규화를 하는게 좋은 것은 아니다.
물론 중복되는 데이터를 최소화하는 장점이 있지만, 그만큼 테이블이 많이 분해된다. 이렇게 많이 분해하다 보면 다시 조인할 때 쿼리의 성능이 크게 떨어질 수 있다.
따라서 자주 사용되는 쿼리를 고려하여, 데이터 중복을 감안해 역정규화를 하는 것이 효율적일 수 있다.
'데이터베이스 > MySQL' 카테고리의 다른 글
집계함수와 제어키워드 (0) | 2024.07.10 |
---|---|
구글 클라우드를 통한 MySQL 배포하기 (0) | 2024.07.09 |
데이터 모델링이란? (0) | 2024.07.09 |
제약 조건과 키 (0) | 2024.07.09 |
SQL이란? 그리고 MySQL 기초 (0) | 2024.07.08 |