Post List

2015년 1월 6일 화요일

데이터베이스 정규화 (Database Normalization)

Database Normalization

먼저 DB 정규화란 무엇일까 ?

RDBMS(관계형 데이터베이스: Table간에 관계를 맺을 수 있는 상황)에서 중복을 최소화 하기 위해서 Data를 구조화 하는 작업

하는 이유는 ?

Database Performance(성능)는 얼마나 물리적 Disk에서 I/O를 적게 하느냐에 따라 달려있다. DB의 I/O는 Block 단위로 이루어 진다. I/O를 최소화 하기 위해서는 Data의 중복을 줄여서 같은 결과를 얻어내기 위해서 탐색해야할 Table의 물리적 크기를 최소화 하는것이 중요하기 때문이다.

정규화에는 1NF , 2NF , 3NF , BCNF , 4NF , 5NF , 6NF 가 있으며
보통 3NF 가 되었으면 '정규화 되었다' 라고 한다.

실무에서는 대규모 데이터 처리시 성능향상을 위해 정규화를 안쓰거나 정규화되어있는 Data들을 역정규화하여 Join 을 줄이는 경우가 많다. 정보를 2개의 Table로 나누어 두었다고 할 때 정보를 불러오기 위해 2개의 Table에 각각 접근해야 하므로 부하(Load)가 걸린다고 생각을 하기 때문이다. 하지만 이건 큰 실수이다. Data를 몰아두었을 때 당연히 더 빠른 성능을 보장한다고 생각하지만 절대 그렇지 않다. Query 실행시 결과 도출할 때까지 읽어야할 물리적 Block수를 최소화 하는게 더 빠른 성능을 보장한다. 현업에서 역정규화하여 더 빠른 성능을 냈을 때는 Query문을 수정하여 D/B Optimizer의 Excution Plan(실행 계획)을 수정하게 하는 쪽으로 노력을 해야 할 것이다.


1NF : 각 속성은 반드시 원자값을 가져야 한다.

- 여러 값을 가진 Column은 존재할 수 없다. 각 행과 열에는 하나의 값만이 올 수 있다.
- 모든 항목에 값이 있어야 하며(NULL 허용안함), 중복 기능 Column이 없어야 한다.

 고객과 취미를 저장하는 Data를 아래와 같이 표현이 가능하다.




위의 2가지 경우 모두다 1NF를 위반한다. 이를 1NF를 만족하는 모양으로 만들면 아래와 같다.



이렇게 Table을 분리함으로써 하나의 Column은 하나의 값만을 가지며, 모든 항목에는 값이 있으며, 중복 기능 Column이 없어졌다.


2NF : Key가 아닌 모든 Column은  Key 전체에 의존적이어야 한다. (완전 함수 종속)

- Key의 일부 속성에만 의존적인 값이 있어서는 안된다.
- Key에 종속적이지 않은 값이 있어서는 안된다.

수강신청에 대해서 예를 들어 보겠다.



PK (Primary Key)로 교과목Code 와 학번 으로 설정하였다.
교과목명칭은 교과목Code에만 의존적이고,
수강색이름은 학번에만 의존적이다.
학점과 출석일수는 PK 전체에 의존적이다.

단순히 생각을 했을 때에는 M:N Intersection Entity 로 정의를 하여서 아래와 같이 표현이 가능할 것이다.



M:N 관계를 N:1 관계로 나누는 것이 좋다. 최종적으로는 아래와 같이 Relationship을 별도 Table로 분리하면 아래와 같다.
2NF에서 M:N Relation Entity를 제거한 것이 4NF 이다.




3NF : Key가 아닌 Column에 의존적이어서는 안된다.

- Key가 아닌 Field에 의존적인 Column은 별도 Table로 분리해야 한다.
- 다른 Field에 의해 계산되는 Column이 존재하면 안된다. (이건 Query문에서 계산으로 처리하면 된다.)



위의 Table을 잘 살펴보면 location Filed가 deptno에 의존적이라는 것을 알수가 있다.
3NF가 만족하도록 수정하려면 아래와 같이 수정하면 된다.




BCNF : 결정자는 반드시 Key 이어야 한다.

- Key가 아닌 결정자는 있을 수 없다.
- 결과적으로 모든 속성들이 후보키로 사용이 가능한 형태로 분해되어야 한다.

1NF에서 곧바로 BCNF 정규화

학번 -> 이름, 학년, 학과
과목 -> 학점, 교수
교수 -> 개설학과

와 같을 때 결정자를 기준으로 Table 분리

학생 (학번, 이름, 학년, 학과)
수강과목 (과목, 학점, 교수)
교수 (교수, 개설학과)
수강 (학번, 과목)

3NF 이면서 BCF가 아닌 예

A, B, C, D 속성을 가진 Table에서
ABC : Key
ABC -> D, D -> A 의 의존성이 있는 경우

Key 이외의 속성 D는 Key에 의해서만 결정되므로 3NF 만족 하지만
A는 D에 의존적이므로 BCF는 아님

5NF 는 실무에서 사용되지 않는다.

6NF : Join 종속이 후보키를 통해서만 성립 (모든 원소들이 후보키를 포함한 Relation)


 참조 : http://brain.payzip.co.kr
          http://brown.ezphp.net/125
          https://lael.be/556

댓글 없음:

댓글 쓰기