데이터베이스 정규화란
데이터 중복을 최소화 혹은 없애기 위한 작업을 의미합니다.
정규화의 단계는 1NF 부터 시작해서 2NF, 3NF, BCNF, 4NF, 5NF 단계로 이루어 집니다.
주로 3NF 단계에서 정규화 작업은 끝이나며,
너무 많은 정규화 작업은 JOIN 으로 인하여 성능을 떨어트릴 수 있으므로 주의하여야 합니다.
요즘 한창 이슈인 코인에 대해서 예시를 들어보겠습니다.
1NF
각 열의 데이터가 하나의 값만 가지고 있는 경우를 의미합니다.
특정 테이블에 아래와 같은 데이터가 있다고 가정합니다.
사용자 고유 식별번호 | 사용자 이름 | 보유 코인 |
1001 | 홍길동 | 비트코인 |
1002 | 임꺽정 | 비트코인, 리플 |
1003 | 성춘향 | 리플 |
혹은 다음과 같을 수도 있습니다.
사용자 고유 식별번호 |
사용자 이름 |
보유 코인 1 |
보유 코인 2 |
1001 |
홍길동 |
비트코인 |
|
1002 |
임꺽정 |
비트코인 |
리플 |
1003 |
성춘향 |
리플 |
|
1NF 의 법칙에 따라 기존의 테이블은 "사용자 고유 식별번호" PK 키 기준으로 변경되어야 합니다.
사용자 고유 식별번호 |
사용자 이름 |
보유 코인 |
1001 |
홍길동 |
비트코인 |
1002 |
임꺽정 |
비트코인 |
1002 |
임꺽정 |
리플 |
1003 | 성춘향 | 리플 |
2NF
중복되는 데이터에 대해서 다른 테이블로 분리되어 있을 때(완전 함수 종속 관계)를 의미합니다.
1NF 정규화 식에 의해 각 열의 컬럼에는 하나의 데이터만 들어가게 되었습니다.
그러나 위의 1NF 에서는 임꺽정 사용자의 레코드가 2개나 차지하고 있습니다. 이 부분을 테이블을 분리하여 데이터 중복을 최소화 합니다.
사용자 고유 식별번호 |
사용자 이름 |
1001 |
홍길동 |
1002 |
임꺽정 |
1003 |
성춘향 |
사용자 고유 식별번호 |
보유 코인 |
1001 |
비트코인 |
1002 |
비트코인 |
1002 |
리플 |
1003 |
리플 |
3NF
2NF 를 만족하며, PK 컬럼이 아닌 컬럼들이 서로 종속되지 않을 때를 의미합니다.
2NF 까지 만족되어진 또다른 테이블이 아래와 같이 있습니다.
사용자 고유 식별번호 |
코인 거래 가능 여부 |
코인 명 |
1001 |
TRUE |
비트코인 |
1002 |
TRUE |
비트코인 |
1002 |
FALSE |
리플 |
1003 | FALSE | 리플 |
이 테이블의 "코인 거래 가능 여부" 필드는 "사용자 고유 식별번호" 가 아닌 "코인 명" 에 종속되므로 3NF 를 만족하지 못합니다.
따라서 아래와 같이 분리합니다.
사용자 고유 식별번호 |
코인 명 |
1001 |
비트코인 |
1002 |
비트코인 |
1002 |
리플 |
1003 | 리플 |
코인 명 |
코인 거래 가능 여부 |
비트코인 |
TRUE |
리플 |
FALSE |
BCNF
어떤 테이블의 determinant 가 후보키 인 경우를 의미합니다.
또다른 테이블이 아래와 같이 있습니다.
사용자 명 |
소유 코인 명 |
코인 배급사 |
홍길동 |
비트코인 |
B |
홍길동 |
리플 |
U |
임꺽정 |
비트코인 |
B |
임꺽정 |
이오스 |
C |
임꺽정 |
이더리움 |
K |
성춘향 | 리플 | U |
성춘향 | 이더리움 | K |
위 테이블의 후보키는 "사용자 명", "소유 코인 명" 입니다. 따라서 두 컬럼을 통해 레코드를 구별할 수 있습니다.
그러나 코인 배급사에 의해 소유 코인 명이 결정되는 관계가 존재하여 BCNF 를 만족하지 않으므로, 아래와 같이 분리하여야 합니다.
사용자 명 |
소유 코인 명 |
홍길동 |
비트코인 |
홍길동 |
리플 |
임꺽정 |
비트코인 |
임꺽정 |
이오스 |
임꺽정 |
이더리움 |
성춘향 |
리플 |
성춘향 |
이더리움 |
소유 코인 명 |
코인 배급사 |
비트코인 |
B |
리플 |
U |
이오스 |
C |
이더리움 |
K |
4NF
다중값 종속을 제거하는 과정을 의미합니다.
다치종속(MVD) 개념을 통해 정의됩니다.
다음과 같이 코인 배급사와, 배급되는 코인 명, 설명이 있습니다.
코인 배급사 |
배급 코인 명 |
설명 |
B |
비트코인 |
메이저 코인입니다. |
이더리움 |
거래가 많이 일어납니다. |
|
U |
리플 |
마이너 코인입니다. |
거래가 적당히 일어납니다. |
||
미래가 밝습니다. |
위 테이블을 레코드로 표현하면, 아래와 같습니다.
이 때 U 배급사의 배급 코인 명이 변경되면 3개의 레코드가 변경되어야 합니다.
코인 배급사 | 배급 코인 명 | 설명 |
B | 비트코인 | 메이저 코인입니다. |
B | 비트코인 | 거래가 많이 일어납니다. |
B | 이더리움 | 메이저 코인입니다. |
B | 이더리움 | 거래가 많이 일어납니다. |
U | 리플 | 마이너 코인입니다. |
U | 리플 | 거래가 적당히 일어납니다. |
U | 리플 | 미래가 밝습니다. |
위 문제를 해결하기 위해, 테이블을 4NF 정책에 맞게 변경합니다.
코인 배급사 |
배급 코인 명 |
B |
비트코인 |
B |
이더리움 |
U |
리플 |
코인 배급사 |
설명 |
B |
메이저 코인입니다. |
B |
거래가 많이 일어납니다. |
U |
마이너 코인입니다. |
U |
거래가 적당히 일어납니다. |
U |
미래가 밝습니다. |
5NF
... 여기는 저도 이해하기 매우 힘드네요 ㅠㅠ
실력이 더 좋아져 이해하는 날 추가 작성해 보겠습니다.
사실 4NF 부터는 냉정하게 현재의 저도 힘든 작업입니다..
또한 정규화 작업은 다양한 경우에 테이블 구조에 따라 다르므로, 많은 예외사항과 제가 포스팅한 부분이 맞지 않을 수도 있습니다.
이 때에는 과감히 지적해주세요. 서로 도움이 되었으면 좋겠습니다.
'Database > 개념' 카테고리의 다른 글
[DATABASE] 데이터베이스 복합 인덱스를 사용하여 속도 향상하는 방법 알아보기 (0) | 2018.08.17 |
---|---|
[DATABASE] 데이터베이스 스캔방식 설정으로 쿼리 응답속도 높이는 방법 알아보기 (0) | 2018.08.17 |
[DATABASE] 데이터베이스 OLAP 과 OLTP 의 차이점, 그리고 DW 의미 알아보기 (0) | 2018.05.26 |
[DATABASE] 데이터베이스 분산트랜잭션, XA 트랜잭션 의미 알아보기 (0) | 2018.01.25 |
[DATABASE] 데이터베이스 속도와 처리량 Latency 와 Throughput 의미 파악하기 (0) | 2018.01.22 |