본문 바로가기
I LEARNED/자료구조

[자료 구조] 정규화(Normalization)

by veganwithbacon 2022. 8. 18.
반응형

코드에 대해서 피드백을 받다가 DB의 연관관계에 관해서 말을 듣다보니 정규화에 대해 개념정리가 필요할 것 같다는 생각을 다시하게 되어 정리하게 되었다

  데이터베이스 정규화?

데이터의 중복을 줄이고 무결성을 향상시키는 등 여러 목적을 달성하기 위해 재 디자인 하는 것이다. 

=> 릴레이션 내에서 중복을 제거하는 과정

 

 데이터베이스 정규화의 목적 

1. 불필요한 데이터를 제거,데이터의 중복을 최소화 ( 저장 공간 최소화)

2. 각종 이상 현상을 방지하기 위해,테이블의 구성을 논리적이고 직관적으로

3. 데이터 테이블 구성이 논리적,직관적으로 하기 위해(자료 구조의 안정성 최대화)

4. 다양한 관점에서 query를 지원하기 위해 (효과적인 검색 알고리즘)

5. 무결성 제약조건의 시행을 간단하게 하기 위해( 데이터 무결성 유지)

 

 데이터베이스 정규화의 장점

- 응용 프로그램 단에서 불필요한 로직을 없앨 수 있다

- 올바른 데이터만 얻을 수 있다(변칙 방지)

- 불필요한 쿼리 제거로 성능 향상

 

 데이터베이스 정규화의 단점

- 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다(응답 시간이 느려질 수 있다)

 

데이터를 결정하는 결정자에 의해 함수적 종속을 가진 일반 속성에 의존하여 입력/수정/삭제 이상을 제거하는 것이다.또한 동일한 의미의 일반 속성이 결정자에 의해 하나의 테이블로 집약되어 한 테이블의 데이터 용량이 최소화된다.

따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다

 

 

 정규화의 대상

온라인 거래 시스템 같은 OLTP(Online Transaction Processing)데이터베이스는 CRUD가 많이 일어나서 정규화가 필요

           

 OLTP 데이터베이스는 분석과 리포팅을 위해 사용되기 때문에 연산의 속도를 위해 반정규화의 대상이기도 하다

   반정규화(Denormalization)?

           정규화된 시스템을 성능 향상 및 개발과 운영의 단순화를 위해 역으로 정규화를 수행하는 것

           일반적으로 join 사용이 많이 필요할 경우, 많은 범위를 자주 처리할 경우 등 조회에 대한 처리가 중요할때

           부분적으로 반정규화를 진행한다

 

  정규화의 과정

정규화는 1부터 6까지 있으나, 실무에서는 대체로 1~3정규화까지의 과정을 거침

- 제1정규화 : 각 컬럼들은 값이 원자값을 만족하는 것

- 제2정규화 : 테이블의 모든 컬럼에서 부분 함수적 종속을 제거하는 것

- 제3정규화 : 기본키를 제외한 속성들 간의 이행적 함수 종속을 없애는 것

- BCNF        : 결정자이면서 후보키가 아닌 것들을 제거

- 제4정규화  : 다치 종속 제거

 

 

 

 함수적 종속성(Functional Dependency)

: 데이터들이 어떤 기준 값에 의해 항상 종속되는 현상

 

- 종속성 유형

유형 내용
함수적 종속성
- 하나의 속성이 다른 속성을 결정 지음
- 릴레이션 R에서 XY : X Y 결정자, Y X 종속자
- 완전 함수 종속, 부분 함수 종속, 이행 함수 종속 적용 : 1NF, 2NF, 3NF, BCNF
다중값 종속성
- 릴레이션에 이상의 독립적인 다중값 속성이 존재하는 경우 이를 1NF 전환하면 다중값 종속 발생
- 개의 독립적인 다중값 속성을 서로 다른 개의 릴레이션으로 분리, 적용 사례 : 4NF
결합 종속성 릴레이션 중에서 둘로 나눌 때에 원래의 관계를 회복할 없으나,
또는 이상으로 분리시킬 원래의 복원할 있는 경우, 적용사례 : 5NF
 

 

 

참고자료 : 

https://developer111.tistory.com/80

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bi1189&logNo=221508895820 

https://hoyeonkim795.github.io/posts/normalization/

https://rebro.kr/160

 

반응형

댓글