티스토리 뷰

공부

[DB] 정규화

seunggabi 승가비 2018. 8. 16. 18:50

정규화란?

RDBMS에서 테이블간에 관계를 맺을 데이터 Redundancy 최소화 하기 위해서 테이블을 쪼개는 작업을 의미한다.

1NF, 2NF, 3NF, BCNF, 4NF, 5NF, 6NF 있으며, 3NF 되었으면 정규화 되었다고 의미한다.

하지만 실무에서는 대규모 데이터 처리시 성능(Performance)향상을 위해 정규화를 쓰지 않거나 낮은 수준의 정규화를 만족하는 경우가 많다.


1NF(원자값)

테이블에 있는 모든 속성의 도메인이 원자값으로만 되어 있는 유형, 반복되는 그룹속성은 테이블을 나눠준다.


2NF(부분함수 종속 제거)

기본키 2 이상으로 구성되는 테이블에서 일부 속성에 대해서만 부분적으로 함수 종속인 것을 분리

부분함수 종속성을 제거해준다.(만약 기본키가 하나인 경우 2NF 하지 않는다.)

A, B -> C, D / A -> C

A, B -> D / A -> C


3NF(이행적 종속 관계 제거)

A->B, B->C => A->C


BCNF(Boyce-Codd Normal Form)

모든 결정자가 후보키가 되도록 한다, 식별자 속성 중에 상호간의 함수종속 관꼐를 가지는 것을 분리한다.


정규화의 이유?

이상(Anomaly)현상을 막기 위해서다.

삭제이상: 삭제를 했더니 데이터가 사라졌다.

갱신이상: 중복된 데이터가 하나만 갱신되고 나머지는 갱신이 안됐다.

삽입이상: 삽입할 원하지 않는 데이터까지 넣어야 한다.


장점

이상현상을 막을 있다.


단점

원하는 데이터를 만들기 위해서는 테이블을 JOIN 해야만 한다. JOIN해서 데이터를 가공하는 것은 엄청난 오버헤드를 발생시킨다. 그래서 삽입 or 삭제가 잦은 테이블이 아니고 조회를 자주 사용하는 테이블이라면 인덱스를 부여하고 정규화를 하지 않는 것이 Performance 향상에 좋다.


'공부' 카테고리의 다른 글

[DB] 트랜잭션(작성중)  (0) 2018.08.27
[OS] Process & Thread  (0) 2018.08.20
[DB] 정규화  (0) 2018.08.16
[Server] Redis?  (0) 2018.08.12
[JS] MobX?  (0) 2018.08.12
[Pattern] MVC / MVVM / MVP / MVW(작성중)  (0) 2018.08.12
댓글
댓글쓰기 폼