반응형

 

데이터베이스 정규화란?

데이터의 중복을 최소화하고 데이터의 무결성을 향상하며 유연하게 데이터들을 구조화하는 프로세스를 의미합니다.

데이터베이스를 정규화할 때 정규화된 정도에 따라 정규형(Normal Form)으로 표현하는데, 1NF, 2NF, 3NF, BCNF, 4NF, 5NF, 6NF까지 있습니다. 보통 3NF 정도 되면 정규화되었다고 하며 3NF 테이블의 대부분은 이상 현상(Anomaly)이 발생하지 않습니다. 각 정규형이 되기 위해선 만족시켜야 할 제약조건들이 있으며, 높은 차수의 정규형 일 수록 조건이 까다롭습니다.

 

정규화의 목적

  • 불필요한 중복 데이터를 제거함
  • 각종 이상 현상(Anomaly)을 방지하고 테이블의 구성을 논리적이고 직관적이게 함
  • 데이터베이스 구조 확장 시 재디자인 최소화

데이터베이스 정규화를 통해서 테이블 간의 중복된 데이터를 제거하여 DB 용량을 최적화할 수 있고,
새로운 데이터형을 추가로 인한 확장 시 그 구조에 대한 영향을 최소화할 수 있습니다.

또한 데이터베이스의 변경 시 이상 현상(Anomaly)을 방지할 수 있는데,
여기서 이상 현상(Anomaly)이란 테이블을 수정(갱신, 삽입, 삭제) 시, 발생하는 부작용을 의미합니다.

 

<이상 현상(Anomaly)>

- 갱신 이상

Employee ID : 519인 직원의 주소를 갱신하였지만 다른 레코드에서 다른 주소를 가지고 있기 때문에 해당 직원의 주소는 어디인가에 대한 질문에 대해 혼동을 줄 수 있습니다. 이러한 현상을 갱신 이상이라고 합니다.

 

- 삽입 이상

Faculty ID : 424 인 Dr. Newsome 교수는 고용 일자가 기록되어 있지만 아직 맡은 강의가 없기 때문에 Course Code를 NULL로 하지 않는 이상 테이블에 추가를 할 수 없습니다. 이러한 현상을 삽입 이상이라고 합니다.

 

- 삭제 이상

Faculty ID : 389인 Dr. Giddens 교수의 강의가 만약 임시로 중단될 때 해당 레코드를 삭제 시 교수 자체의 데이터가 삭제되는 현상이 발생하게 됩니다. 이렇게 데이터의 삭제가 전혀 다른 사실에 대한 데이터의 삭제도 필요로 하게 되는 현상을 삭제 이상이라고 합니다.

 

정규화의 대상

정규화(Normalization) & 반정규화(Denormalization)

반정규화란 시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정을 뜻합니다. 

온라인 거래 시스템 같은 OLTP(OnLine Transaction Processing) 데이터베이스는 CRUD(Create, Read, Update, Delete)가 많이 일어나기 때문에 정규화되는 것이 좋지만,

분석 리포트 같은 OLAP(OnLine Analytical Processing) 데이터베이스는 분석과 리포팅을 위해 사용되기 때문에 연산의 속도를 위해 반정규화(denormalization)의 대상이 됩니다.

 

정규화 과정

 

제 1 정규화(First Normal Form, 1NF)

제 1 정규화는 테이블의 칼럼이 원자 값(하나의 값)을 갖도록 테이블을 분해하는 것입니다.
예를 들어 아래와 같은 테이블이 있다고 할 때,

학번 과목코드 성적 이름
201510735 A1001, A2002, A3003 A+, C+, B Cocoon

칼럼이 원자 값을 가지고 있지 않기 때문에 제 1 정규형을 만족하지 않습니다. 
따라서 아래와 같은 형태로 바꿔줍니다.

학번 과목코드 성적 이름
201510735 A1001 A+ Cocoon
201510735 A2002 C+ Cocoon
201510735 A3003 B Cocoon

 

제 2 정규화(Second Normal Form, 2NF)

제 2 정규화는 제 1 정규화에 속하면서, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속된 형태입니다.

학번 과목코드 성적 학과 등록금
201510735 A011011 A+ 기계공학과 480
201510735 A022022 A 기계공학과 480
201510735 A033033 B 기계공학과 480
201810222 B066066 B 컴퓨터공학과 500
201910987 C011011 A 전기공학과 490
201610111 D044044 A+ 기계공학과 480

 

함수의 종속성을 살펴보자면

  • {학번, 과목 코드} -> 성적
  • {학번, 과목 코드} -> 학과
  • {학번, 과목 코드} -> 등록금
  • 학번 -> 학과
  • 학번 -> 등록금
  • 학과 -> 등록금

학번 -> 학과, 학번 -> 등록금 두 개의 부분 함수 종속성을 가지고 있기 때문에
이를 제거해주는 것을 제 2 정규화라고 합니다.

위의 테이블에서 기본키는 {학번, 과목 코드}로 복합 키입니다. 

그런데 여기서 학과나 등록금은 기본키의 부분집합인 학번에 의해 결정될 수 있습니다.

그렇기 때문에 위의 테이블에서 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되게 분리를 하면 아래와 같습니다.

<학생 테이블>

학번 학과 등록금
201510735 기계공학과 480
201810222 컴퓨터공학과 500
201910987 전기공학과 490
201610111 기계공학과 480

<성적 테이블>

학번 과목코드 성적
201510735 A011011 A+
201510735 A022022 A
201510735 A033033 B
201810222 B066066 B
201910987 C011011 A
201610111 D044044 A+

두 테이블 모두 제 1 정규형에 속하고, 기본키를 제외한 모든 속성이 기본키에 완전 함수 종속되므로 제 2 정규형을 만족하게 됩니다.

하지만 제 2 정규형을 만족하더라도 이상 현상이 발생할 수 있는데

 

갱신 이상

기계공학과의 등록금이 480에서 500으로 인상되어 데이터를 갱신하였지만 다른 레코드에서는 480으로 표시되기 때문에 데이터 불일치 문제가 발생하게 됩니다.

삽입 이상

새로운 학과가 개설되고 등록금이 정해지지 않았다면 등록금 속성을 NULL로 하지 않는 이상 테이블에 추가를 할 수 없게 됩니다.

삭제 이상

201610111 학번을 가진 학생이 자퇴하는 경우 기계공학과에 대한 정보도 함께 사라지게 됩니다.

 

제 3 정규화(Third Normal Form, 3NF)

제 2 정규화에 속하면서, 기본키를 제외한 모든 속성이 기본키에 이행적 함수 종속이 되지 않는 형태입니다.

이행적 함수 종속이란 A, B, C에 대해 A -> B이고 B -> C 이면 A -> C 가 성립하는 경우입니다.
C가 A에 이행적으로 함수 종속되었다고 하며, 삼단논법 같은 관계를 가진 함수 종속이라고 생각하시면 됩니다.

<학생 테이블>

학번 학과 등록금
201510735 기계공학과 480
201810222 컴퓨터공학과 500
201910987 전기공학과 490
201610111 기계공학과 480

제 2 정규화 과정을 거친 학생 테이블에서 함수적 종속성은 아래와 같습니다.

  • 학번 -> 학과
  • 학과 -> 등록금
  • 학번 -> 등록금

통상적으로 학과에 의해 등록금이 결정되는 것이지 학번에 의해 등록금이 결정되는 것은 아니기 때문에 분리해줍니다.

<학생 테이블>

학번 학과
201510735 기계공학과
201810222 컴퓨터공학과
201910987 전기공학과
201610111 기계공학과

<학과 테이블>

학과 등록금
기계공학과 480
컴퓨터공학과 500
전기공학과 490

 

 

 

 

 

 

<출처>

https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94

https://wkdtjsgur100.github.io/database-normalization/

https://velog.io/@wldus9503/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%A0%95%EA%B7%9C%ED%99%94Normalization%EB%9E%80

https://yaboong.github.io/database/2018/03/09/database-normalization-1/

반응형

+ Recent posts