1. 정규화의 목표
정규화의 목표는 테이블 간에 중복된 데이터를 허용하지 않는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성을 유지할 수 있으며, 데이터 베이스의 저장 용량도 줄 일 수 있다.
2. 제 1 정규화
제 1 정규화란 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것 이다.
다음과 같은 상품 테이블이 있다고 할 때 현재 카테고리 컬럼에 여러개의 값이 들어가고 있다. 즉, 제 1 정규형을 만족하지 못하고 있다.
[상품 테이블]
상품명 | 카테고리 |
새우깡 | 과자,간식 |
감자칩 | 과자 |
왕뚜껑 | 라면,식품 |
위의 테이블을 정규화하면 아래와 같다.
[상품 테이블]
이름 | 카테고리 |
새우깡 | 과자 |
새우깡 | 간식 |
감자칩 | 과자 |
왕뚜껑 | 라면 |
왕뚜껑 | 식품 |
3. 제2 정규화
제2 정규화란 제 1정규화를 진행한 테이블에 대해서 기본키의 부분 집합이 결정자가 되어선 안된다는 것을 의미한다.
2개 이상의 PK로 구성된 테이블에서 발생한다.
이렇게 말로 쓰면 이해가 안되기 때문에 예시를 통해서 살펴보자. 다음과 같이 주문 상품 테이블이 있다고 하자.
[주문 상품 테이블]
주문 번호(PK) | 상품 번호(PK) | 상품명 |
1 | 4 | 새우깡 |
2 | 5 | 감자칩 |
3 | 6 | 왕뚜껑 |
위의 테이블에서 PK는 주문 번호와 상품 번호이다. 하지만 상품명은 상품 번호만 결정되도 알 수 있다. 즉, 제 2 정규화를 만족하지 못한다. 또한 상품 테이블에 상품명이 있고, 주문 상품 테이블에도 상품명이 있기 때문에 데이터가 중복된다. 따라서 아래와 같이 분리 해야한다.
[상품 테이블]
상품 번호(PK) | 상품명 |
4 | 새우깡 |
5 | 감자칩 |
6 | 왕뚜껑 |
[주문 상품 테이블]
주문 번호(PK) | 상품 번호(PK) |
1 | 4 |
2 | 5 |
3 | 6 |
4. 제 3 정규화
제 3 정규화란 제 2 정규화를 진행한 테이블에 대해서 식별자 이외의 속성간에 종속성이 생기면 안되는 것을 말한다.
종속 관계가 생기면 중복값이 생긴다. 이행 종속 관계를 분리한다. (A->B, B->C 이면 A->C)
주문 테이블 예시를 살펴보자.
[주문 테이블]
주문 번호(PK) | 날짜 | 회원 번호 | 전화번호 |
1 | 2021-10-24 13:00 | 3 | 010-2222-2222 |
2 | 2021-10-25 14:00 | 4 | 010-3333-3333 |
위의 테이블을 봤을 때 PK는 주문 번호이다. 하지만 회원 번호가 결정되면 전화번호도 결정된다.
따라서 이행 종속 관계를 분리하면 아래와 같이 분리할 수 있다.
[주문 테이블]
주문 번호(PK) | 날짜 | 회원 번호 |
1 | 2021-10-24 13:00 | 3 |
2 | 2021-10-25 14:00 | 4 |
[회원 테이블]
회원 번호 | 회원명 | 전화번호 |
3 | 김철수 | 010-2222-2222 |
4 | 홍길동 | 010-3333-3333 |
5. BC 정규화 (BCNF 정규화)
BCNF 정규화란 제 3 정규화를 진행한 테이블에 대해서 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
교수가 한가지 과목만을 가르칠 수 있다고 할 때 다음 수강 테이블은 교수가 정해지면 과목을 알 수 있다고 가정해보자.
[수강 테이블]
학생(PK) | 과목(PK) | 교수 |
홍길동 | 데이터베이스 | 김교수 |
김영희 | 네트워크 | 박교수 |
김철수 | 운영체제 | 추교수 |
위의 테이블에서 PK는 학생과 과목이다. 하지만 교수가 정해지면 과목이 정해진다. 이렇게 되면 교수에의해서 후보키가 결정되는 것이다. 따라서 다음과같이 분해해야한다.
[수강]
학생(PK) | 과목(PK) |
홍길동 | 데이터베이스 |
김영희 | 네트워크 |
김철수 | 운영체제 |
[과목 테이블]
과목 | 교수 |
데이터베이스 | 김교수 |
네트워크 | 박교수 |
운영체제 | 추교수 |
6. 역정규화(반정규화)
역정규화란 효율을 위해서 정규화된 결과의 일부를 수정하여 중복을 허용하는 것을 말한다.
정규화되지 않은 상태에서 중복을 허용하는 것과는 다르며, 대부분 join을 할 경우 엄청난 계산량을 해결하기 위해서 사용한다.
예를 들어서 고객 테이블에 천만건의 데이터가 있고, 주문 테이블에 10억건의 데이터가 있다고 가정해보자. 이때 주문 데이터를 가져올 때 주문자의 전화번호를 알기 위해서는 고객 테이블과 join을 해야한다. 데이터가 많은 것 들끼리 조회하기 때문에 연산량이 많아진다.
[고객 테이블]
고객 | 전화번호 |
홍길동 | 010-2222-2222 |
김철수 | 010-3333-3333 |
[주문 테이블]
주문 번호 | 고객 |
1 | 홍길동 |
2 | 김철수 |
이를 역정규화를하면 주문 테이블에서 회원의 전화번호를 가지고올 수 있게 설계할 수 있다.
[주문 테이블]
주문 번호 | 고객 | 전화번호 |
1 | 홍길동 | 010-2222-2222 |
2 | 김철수 | 010-3333-3333 |
REFERENCE
'Database' 카테고리의 다른 글
[Database] HASH JOIN 최적화 (0) | 2021.11.14 |
---|---|
[Database] SORT MERGE JOIN 최적화 (0) | 2021.11.14 |
[Database] 데이터베이스 I/O 원리 및 최적화 (0) | 2021.11.14 |
[Database] Nested Loop 최적화 (2) | 2021.11.14 |
Statement와 PreparedStatement (0) | 2021.10.17 |