정규화란?
관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다.
데이터를 정규화하지 않으면 쿼리의 성능이 저하되고, 삽입이상, 갱신이상, 삭제이상 등의 이상현상이 발생한다.
삽입이상은, 원치 않은 데이터가 삽입되는것, 갱신이상은 원치 않게 일부 데이터만 갱신되는 것, 삭제이상은 원치 않는 데이터가 삭제되는 것 을 말한다.
정규화의 종류에는 1NF(1정규화), 2NF, 3NF, BCNF(보이스-코드 정규화), 4NF, 5NF, (6NF)가 있다.
비공식적으로 3NF면 정규화되었다고 한다.
반대로 테이블을 합쳐서 중복되게 하는 것을 반정규화라고 한다. 성능상의 이유로 반정규화를 진행하기도 한다.
1NF
1. 도메인(각 칸의 값)이 원자값(하나의 값)을 가져야 한다.
신용카드 사용 내역 테이블에는 사용내역이도메인이 원자값이 않았다.
모든 고객들에 대하여 2010년 10월에 이루어진 모든 거래의 거래량(돈)의 합을 구하기 위해서는 :
1. 각 고객들로부터 거래를 추출
2. 일자가 2010년 10월인 거래들의 잔고의 합을 구한다.
그럼 1정규화를 해보자. (더 유연해질 것이다.)
이제 모든 도메인이 원자값을 갖는다.
이제 위의 질문에 답하려면 :
1. 일자가 2010년 10월인 거래들의 잔고의 합을 구한다.
간단해졌다.
2정규형
1. 1NF를 만족해야 한다.
2. 부분함수 종속을 제거해야 한다.
이러한 테이블이 있을 때, 학번(A)을 통해 이름, 소속학과, 학과장(B)을 알 수 있다.(정해진다.) 반면, 반대로는 하나의 학번이 정해지지 않는다. 예를 들어 컴퓨터과는 1901, 1925 학번이 있다. 이런 경우 B는 A에 함수종속(Function Dependecny, FD) 이라고 하고 A->B로 표현한다.
{학번} -> {이름, 소속학과, 학과장} 인데 이때, 학과장은 소속학과 하나에도 종속된다. {학과장} -> {소속학과} 이런 경우를 부분함수 종속이라고 한다.
이 부분함수 종속을 제거해보자.
2NF 전에는 컴퓨터과 학과장이 하나만 변해도 모두 찾아서 변경해야 했지만, 이제는 1번만 변경하면 된다.
3정규형
1. 2NF를 만족해야한다.
2. 이행함수종속을 제거해야 한다.
A→B 이고 B→C 일 때 A→C 인 관계를 이행함수종속이라고 한다.
예를 들어 홍길동 → 컴퓨터과이고 컴퓨터과→공대일 때, 홍길동→공대인 관계가 성립한다.
이때 소속대학(공대)를 분리하여 정규화가 필요하다.
BCNF(Boyce and Codd Normal Form)
1. 3NF를 만족해야한다.
2. 결정자이면서 후보키가 아닌 것을 제거해야 한다.
용어 먼저 보자.
후보키
슈퍼키는 레코드를 유일하게 식별해낼 수 있는 속성들의 집합이다. 한 개의 테이블은 여러 개의 슈퍼키를 가질 수 있다.
후보 키는 슈퍼 키에서 레코드를 유일하게 식별하는데 있어서 필요없는 속성을 제거한 슈퍼 키의 부분집합이다.
예를들어 인간 테이블에서 슈퍼키는 (보이는 데이터가 전부라고 할 때)
{학번} 또는 {주민번호}, {이름, 나이} 등이 있다.하나의 레코드를 식별할 수만 있으면 된다.
하지만 후보키는 개수를 최소한으로 한 것이다. 예를 들어 {학번} 또는 {주민번호} 가 개수가 제일 작으므로 후보키가 될 수 있다.
이때, 후보키 중에서 최소성과 유일성을 만족하는 키를 하나만 고르면 그게 기본키(primary key)가 된다. 학번을 선택한다면, 학번에 PK가 된다.
후보키중에서 PK를 정하고 남은 키들은 대체키(Candidate key)라고 부른다. 주민번호가 그 예이다.
결정자
결정자는 A에의해 B가 결정될때 A를 결정자라고 부른다. 인간테이블에서 주민번호는 이름을 결정하므로, 주민번호는 이름의 결정자이다.
다시 BCNF
자 그럼 다시 정규화는 결정자이면서 후보키가 아닌 것을 제거하는 것이다. 즉 모든 결정자가 후보키 집합에 존재해야 한다.
이 테이블에서 학번과 과목은 교수를 결정하지만, 후보키는 될 수 없다. 또, 교수는 과목을 결정하는 결정자이지만 후보키는 될 수 없다. 따라서 이 테이블은 다음과 같이 분리해야한다.
4NF
1. BCNF를 만족해야 한다.
2. 다치 종속(Multi-valued Dependency)이 없어야 한다.
다치종속은 A -> B|C인 경우를 말한다. A이면 X인경우가 있는데, X에는 A도해당되고, B도 해당되는 경우이다.예를 들어서 학생1의 취미는 노래또는 게임인 경우이다.
이러한 다치종속을 제거하면 4NF를 성립한다.
위 2개의 테이블은 여전히 다치 종속성을 가지지만, 2개 이상의 칼럼이 하나의 칼럼에 다치 종속되지는 않기 때문에 제4 정규형을 만족한다.
5NF( Project Join Normal Form(PJNF) )
1. 4NF만족
2. 조인종속 제거
3. 조인 연산을 했을 때 손실이 없어야 한다.
하나의 릴레이션 A를 을 무손실 분해하여 B, C로 분해했다가 다시 합쳐 A가 된다면, 조인종속성이 있다고 한다.
위의 4NF테이블을 다시 조인하면 원래의 테이블이 된다. 조인 종속이 있다는 뜻이다.
이를 분해하여 이렇게 표현할 수 있다.
위키
정규화정리-IT위키
부분함수종속
슈퍼키, 후보키, 대체키, 기본키
https://jerryjerryjerry.tistory.com/49
다치종속
https://code-lab1.tistory.com/270
'SQL' 카테고리의 다른 글
[SQL] PL/SQL declare, begin, end 알아보기, mybatis 쿼리 여러개 한꺼번에 실행하기 (0) | 2021.10.23 |
---|