정규화란 무엇인가?
데이터베이스와 관련된 내용을 찾아보면 정규화라는 내용이 있다.
정규화는 변경 이상을 줄이는 목적과 중복성을 최소화하기 위해 사용한다.
쉽게 말하면 데이터를 잘 저장하려 테이블을 쪼개고 만드는 과정이라 보면 된다.
이때, 어떻게 테이블을 쪼개냐에 따라서 정규형(Normal form; NF)의 종류가 나뉘게 된다.
- +a 변경 이상(Anomaly): 데이터 수정으로 인해 발생하는 문제를 의미.
- 삭제 이상 - 특정 키를 삭제할 때 전체 정보가 삭제되어 버리는 경우
- 삽입 이상 - 없는 정보를 신규로 입력할 수 없는 경우
정규화와 관련된 용어가 혼용되는 경우가 다소 있는데, 통상적으로 "제 1 정규형 = 1차 정규화 = 제 1 정규화 = 1NF = .." 라 보면 되겠다.
여기서는 편의상 제 n 정규화라고 부르겠다.
1NF (제 1 정규화)
주어진 table이 Relation의 조건을 만족하는 경우를 의미한다.
그러면 Relation이 되기 위한 조건이 무엇인가를 알아야 한다.
크게 다음과 같이 2가지가 있다.
- 모든 칸은 단일 속성 (다중 속성이 존재해선 안 된다.)
- 반복그룹 / 배열값이 존재해선 안 된다.
다음의 예제를 토대로 위 말이 무엇인가 살펴보도록 하자.

위 그림은 다중 속성이 존재하는 경우이다.
보면 알겠지만, 번호라는 속성에 저장된 데이터가 여러 개 있는 경우가 있다.
이 경우 대표 전화번호 1개만 저장하거나 혹은 별도로 table을 분리할 필요가 있다.

위 도식은 반복그룹 및 배열값이 존재하는 경우이다.
대충 봐도 알겠지만, 데이터가 체계적이지 않음을 확인할 수 있다.
이 경우도 앞선 내용처럼 대표 번호만 하나 사용하거나 별도로 table을 분리하서 참조하는 형태로 바꿔야 한다.
결국 위 두 가지 사례는 table이긴 하나 Relation이 될 수 없는 상황이다.
따라서 릴레이션의 형태로 바꾸기 위해선 적절히 데이터를 정제하거나 구조를 바꿔줘야 한다.
즉, 1차 정규화 과정이 필요하다.
2NF (제 2 정규화)
제 2정규화는 1NF를 만족하며 모든 속성이 key에 종속되는 경우를 의미한다.
즉, 부분 종속이 되어서는 안 됨을 의미하며, 따라서 자연히 단일 키 Relation은 2NF를 만족하게 된다.
예시를 통해 이해해보자.

위 그림에서 (No., 서비스) -> 사용료인 관계라고 하자.
그런데, 주어진 데이터를 보면 알겠지만 서비스 -> 사용료의 관계가 있음을 알 수 있다.
즉, 부분 종속이 발생하므로 위 테이블은 2NF가 아니다.
이 경우, 가령 (333, 전자책)데이터를 날릴 경우 전자책의 사용료 정보가 실종되어 버리는 삭제 이상이 발생한다.
혹은 별도로 No.를 추가하지 않는 이상 신규 서비스의 사용료 정보를 입력할 수 없다는 삽입 이상도 생긴다.
따라서, 이를 방지하기 위해 (No., 서비스)와 (서비스, 사용료) 로 테이블을 분리해야 한다.
3NF (제 3 정규화)
제 3정규화는 2NF를 만족하며 이행 종속이 존재하지 않는 경우를 뜻한다.
이행 종속이라고 하면, 쉽게 말해 A -> B -> C꼴을 의미한다.
이 또한 예제를 활용해서 이해해보자.

일단 위 데이터에서 No. -> 서비스의 관계가 기본 관계임을 알 수 있다.
그런데, 문제는 서비스 -> 사용료의 관계도 있음을 알 수 있다.
왜냐하면 서비스에 따라서 사용료가 지정되어 있기 때문이다.
즉, No. -> 서비스 -> 사용료의 관계가 되므로, 3NF를 만족하지 못하게 된다.
이 경우도 삽입/삭제 이상이 발생할 수 있다.
따라서 앞선 예제처럼 (No., 서비스)와 (서비스, 사용료)로 분리해야 한다.
BCNF (보이스-코드 정규화)
그 다음 단계는 4NF가 아닌! BCNF이다. (;;;)
BCNF는 3NF를 만족하며, 모든 결정자(determinant)가 후보키가 되는 경우를 의미한다.
역으로 바꿔 말하면, 후보키가 아닌 속성은 결정자가 될 수 없는 경우를 의미한다.
가령 다음의 예제를 보자.

위 조건에서 주 키는 (No., 서비스) 이고, 후보 키는 (No., 담당자) 라고 하자.
이때, 담당자 -> 서비스라는 관계가 생기는 것을 알 수 있다.
그런데, 앞선 조건에 따르면 담당자 단일로는 key가 아니라는 사실을 알 수 있다.
그러나 담당자는 결정자 역할을 수행하고 있다.
따라서 BCNF를 만족하지 못한다.
이 경우도 역시 table을 분리해야 한다.
여기선 (No., 담당자) 와 (담당자, 서비스) 로 분리할 수 있겠다.
4NF (제 4 정규화)
제 4정규화는 BCNF를 만족하고 다치종속이 없는 경우를 의미한다.
다치 종속이란, 어떤 속성이 다른 속성의 여러가지 값을 결정하는 경우를 의미한다.
4NF를 만족하지 못하는 테이블에선 앞선 형태와는 다른 이상 현상이 발생한다.
예제를 통해 알아보자.

위 테이블은 4NF를 만족하지 못하는 형태이다.
보면 알겠지만, 단일 No.가 서비스와 담당자의 여러가지 값을 결정하게 된다.
즉, No. -> -> 서비스이며 No. -> -> 담당자이다.
이 경우 삭제 시 데이터가 왜곡될 수 있으며, 삽입 시에도 관계 해석에서 왜곡이 발생할 수 있다.
가령, 두 번째와 세 번째 데이터를 삭제했다고 하자.
그러면, 영화 서비스를 담당하는 사람은 일이삼, 음악 서비스를 담당하는 사람은 이삼사뿐이라 잘못 해석할 수 있다.
따라서, 이 경우도 table을 분리해야 하며, (No., 서비스) 와 (No., 담당자) 로 분리하면 된다.
그 외 상위 Level의 정규화
정규화 방식 중에는 4NF 이상의 형태도 존재한다.
그러나 테이블의 수가 너무 많아지는 것도 있고 너무 데이터가 쪼개지는 경우도 있어서 실제로는 최대 3NF~4NF까지 주로 활용한다고 한다.
따라서 이 이후의 정규화 요소들은 그냥 이런게 있다고 치고 간략하게 정리하려 한다.
5NF(제 5 정규화)
- 4NF를 만족 & 후보키를 통하지 않은 조인(JOIN)종속 제거
DKNF (도메인-키 정규화)
- 5NF를 만족 & DB에서 도메인 제약조건과 키 제약조건 외의 모든 조건이 없어야 함
6NF(제 6 정규화)
- 5NF를 만족하고 더 나아간 수준의 정규화 형태. 간혹 DKNF하고 비슷하게 쓰이기도 함
'DB, SQL' 카테고리의 다른 글
[MySQL] 과거 강의자료 정리 -1 (0) | 2022.02.12 |
---|---|
[프로그래머스] SQL String과 Date 등.. (0) | 2022.02.10 |
[프로그래머스] SQL JOIN문 (0) | 2022.02.08 |
[프로그래머스] SQL NULL 처리하기 (0) | 2022.02.04 |
[프로그래머스] GROUP BY절 (0) | 2022.01.30 |