[데이터베이스설계] 데이터 정규화

2024. 1. 13. 20:53데이터베이스설계

오늘은 데이터베이스설계 데이터 정규화에 대해서 리마인드 하겠습니다. 학부생 3학년 1학기때 수강한 과목이라 생각이 많이 안나서 강의자료를 뒤져보면서 정리를 했습니다. 

 

1. 데이터 정규화의 필요성

우선 왜 필요한가?에 대해서 알아야합니다. 데이터베이스설계에서 데이터를 정규화하는 이유는 크게 중복 제거, 쿼리 성능 향상, 데이터 품질 향상에 있습니다. 이런 이유에 대해서 삽입/갱신/삭제 시 발생할 수 있는 이상 현상을 방지하고 저장 공간 최소화, 데이터의 일관성 유지, 데이터 구조 최적화 등을 이뤄낼 수 있습니다. 저는 이런것들이 데이터 분석가에게도 많은 도움이 된다고 생각합니다. 

 

2.정규화(Normal Forms)

정규화는 단계가 존재합니다. 지금부터 그 단계에 대한 정규화들의 전체적인 맥락을 정리한 다음 세부내용으로 넘어가겠습니다.

 

- 제1 정규화(1NF) : 테이블의 컬럼이 값을 하나만 갖도록 하는 것

- 제2 정규화(2NF) : 제1 정규화가 되어있는 데이터 테이블을 대상으로 완전 함수 종속을 만족

- 제3 정규화(3NF) : 제2 정규화가 되어있는 데이터 테이블을 대상으로 이행적 종속을 제거

 

이렇게 존재하며 제 4,5 정규화도 있고 BCNF(Boyce-codd Normal Form), DKNF(Domain Key Normal Form)이란 것도 있는데 보통 최대 3NF까지 진행한다고 합니다. 그럼 자세하게 알아보겠습니다.

 

제 1 정규화(1NF)

2번에서 각 정규화의 하는 방법을 간단하게 한 줄로 적어봤는데 아마 제 1NF 빼고는 설명없이는 어려운 것 같습니다. 일단 1NF는 하나의 값만 갖는다를 만족하면 됩니다. 이런 데이터가 있다고 가정하였을 때

이 데이터는 현재 Chau라는 사람의 Club데이터가 2개가 존재합니다. 다른 사람의 Scuba와 Skiing의 Cost데이터를 보면 그것도 합쳐져 있는 상태로 보입니다. 이 상태에서 Skiing을 수강하는 사람의 이름을 알고싶다 하면 Jones 밖에 추출하지 못할 것입니다. 1NF를 하기 위해서는 이 데이터를 쪼개면 됩니다.

Chau의 데이터를 한가지의 값만 갖도록 분리하였습니다. 이제는 데이터가 1NF를 만족하였습니다. 이제 2NF를 만족시켜보겠습니다.

 

제 2 정규화(2NF)

2NF를 하기위해서는 1NF를 만족해야합니다. 2NF를 만족시키기 위해서는 완전 함수 종속을 만들어야 합니다. 이는 부분 함수 종속을 제거한다 라고 생각하면 좋습니다. 우선 데이터 테이블을 보고 각 컬럼의 관계를 전부 알아볼 필요가 있습니다. 어떤 컬럼이 기본키인지, 복합키는 존재하는지 쉽게 말해 어떤 키가 유니크하고, 다른 컬럼들을 결정하는지 볼 필요가 있습니다. 

이 테이블을 보면 Club 컬럼은 Cost 컬럼을 결정합니다. 이는 완전 함수 종속 관계입니다. 하지만 {SID,Club}은 다른 컬럼들을 결정할 수 있습니다. 이는 2개의 컬럼이 다른 컬럼을 정의할 수 있는 것으로 복합키라고 불립니다. 그래서 Cost는 Club도 결정할 수 있고, {SID,Club}도 결정할 수 있게 됩니다. 이것을 분리해준다면 2NF를 만족하게 됩니다.

이렇게 데이터를 만든다면 장점은 예를들어 Scuba의 Cost를 수정하고 싶다 그러면 1NF상태에서는 Club이 Scuba인 모든 행을 찾아서 Cost를 수정해야하지만 이 경우는 첫번째 테이블에서 하나의 값만 수정하면 해결 할 수 있게 됩니다.

제 3 정규화(3NF)

3NF는 이행적 종속 함수가 존재하지 않으면 됩니다. 이행적 함수 종속은 X가 Y를 결정하고, Y가 Z를 결정할 때 X가 Z를 결정하는 것을 의미합니다. 이를 위해서 컬럼을 추가해 보겠습니다. 

현재 이 테이블은 2NF를 만족하는 테이블입니다. 키는 Club이고, 복합키는 존재하지 않으니 부분 함수 종속도 없을 것입니다. 하지만 Club은 Teacher를 결정하고, Teacher는 Universe를 결정하는 이행적 함수 종속이 존재합니다.그래서 Teacher 와 Universe를 나눠주면 3NF가 됩니다.

이 때의 장점 역시 Teacher의 Universe가 바뀌었다하고 가정했을 때 수정하기 더 용이해집니다.

 

학부생 3학년 1학기에 공부하고 놔둔 내용이라서 그 당시 A+과목인데 지금와서 정리하려고 하니까 이게 맞았나? 하고 생각되는 부분이 굉장히 많았던거 같습니다. 정리히면서도 그때 수업자료도 오래 보고 있었습니다.. 이래서 복습이 중요한 것 같습니다.