정규화란?
반복적인 데이터를 분리하고 각 데이터가 종속된 테이블에 적절하게 배치되도록 하는 것
반 정규화란?
정규화된 엔터티, 속성, 관계에 대해 시스템의 성능향상과 개발, 운영의 단순화를 위해
중복, 통합, 분리 등을 수행하는 데이터 모델링의 기법
일반적으로 정규화시 입력/수정/삭제 성능이 향상되며, 반정규화시 조인 성능이 향상된다.
1차 정규화란? (1NF)
모든 도메인이 원자값만으로 구성되도록 하는 정규형
판매 내역 테이블
판매 물건 | 판매 금액 | 거래처 |
사과 | 5000 | 제일상회 |
배 | 10000 | 배민상회, 요기요상회 |
귤 | 3000 | 제주상회 |
판매 물건 | 판매 금액 | 거래처 |
사과 | 5000 | 제일상회 |
배 | 10000 | 배민상회 |
배 | 10000 | 요기요상회 |
귤 | 3000 | 제주상회 |
2차 정규화란? (2NF)
2차 정규형은 부분적 함수 종속을 제거, 테이블의 모든 컬럼이 완전 함수 종속이게 하는 것이다. 무슨소리냐 이게
이게 무슨 말이냐면 기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 것입니다.
위 테이블의 경우 기본키는 (판매물건, 판매처) 두 개로 볼 수 있습니다.
이 두 개가 합쳐져야 한 로우를 구분할 수가 있습니다.
근데 판매 금액의 경우 이 기본키중에 판매물건에만 종속되어 있습니다.
즉, 판매물건의 값을 알면 판매 금액값을 알 수 있습니다.
따라서 판매금액이 두 번 들어가는 것은 불필요한 것으로 볼 수 있습니다.
판매 물건 테이블
판매 물건 | 판매 금액 |
사과 | 5000 |
배 | 10000 |
귤 | 3000 |
거래처 테이블
판매 물건 | 거래처 |
사과 | 제일상회 |
배 | 배민상회 |
배 | 요기요상회 |
귤 | 제주상회 |
이를 해결하기 위한 방법은 위처럼 테이블을 쪼개는 것입니다.
그러면 두 테이블 모두 2차 정규형을 만족하게 됩니다. 위 테이블의 경우 삽입/갱신/삭제 이상을 겪지 않게됩니다.
하지만 조금 더 복잡한 테이블의 경우, 갱신 이상을 겪기도하는데 이를 해결하는 것이 바로 3차 정규화입니다.
3차 정규화란 (3NF)
이행적 함수(X->Y, Y->Z, X->Z)의 종속을 제거 하는것. 이건 또 뭔소리냐
기본키 이외의 다른 컬럼이 그외 다른 컬럼을 결정할 수 없는 것
이와 같은 데이터 구성을 생각해봅시다. Student_id가 기본키이고, 기본키가 하나이므로 2차 정규형은 만족하는 것으로 볼 수 있습니다. 하지만 이 데이터의 Zip컬럼을 알면 Street, City, State를 결정할 수 있습니다. 또한 여러명의 학생들이 같은 Zip코드를 갖는 경우에 Zip코드만 알면 Street, City, State가 결정되기 때문이 이 컬럼들에는 중복된 데이터가 생길 가능성이 있습니다. 정리하면 3차 정규형은 기본키를 제외한 속성들 간의 이행적 함수 종속이 없는 것 입니다. 풀어서 말하자면, 기본키 이외의 다른 컬럼이 그외 다른 컬럼을 결정할 수 없는 것입니다.
3차 정규화는 2차정규화와 마찬가지로 테이블을 분리함으로써 해결할 수 있는데, 이렇게 두 개의 테이블로 나눔으로써 3차 정규형을 만족할 수 있습니다. 이를 통해 데이터가 논리적인 단위(학생, 주소)로 분리될 수 있고, 데이터의 중복(Redundancy)도 줄었음을 알 수 있습니다.
참고 사이트
www.studytonight.com/dbms/database-normalization.php
https://3months.tistory.com/193
'DataBase' 카테고리의 다른 글
[Oracle] 1장. 데이터 베이스 개념 잡기 (1-2 관계형 데이터베이스와 오라클 데이터베이스) (0) | 2022.11.29 |
---|---|
[Oracle] 1장. 데이터 베이스 개념 잡기 (1-1 데이터베이스) (0) | 2022.11.28 |
[Oracle] Oracle 시작하기 (0) | 2022.11.28 |
[Sqld] 파티셔닝(Partitioning) (0) | 2021.03.14 |
[Sqld] Low chaining (0) | 2021.03.14 |