DB

[DB] 정규화 이것보다는 쉽게 설명 못합니다!

Well See Coding 2024. 6. 5. 09:00
반응형

이번 포스팅은 중간중간 보시는 것보단 처음부터 흐름대로 따라서 예시와 함께 설명을 보시면 이해에 훨씬 도움이 됩니다!
 

만약 학생이 국어, 영어, 수학 과목을 수강하는 내용을 데이터로 저장한다면 우리는 위 사진과 같이 저장을 할 것입니다. 그런데 여기서 신짱구 학생이 과학이라는 과목을 추가로 수강한다면 데이터를 어떻게 저장하실 건가요? 두 가지 예시를 가지고 와봤습니다.
 
 

위 테이블처럼 데이터를 저장하게 되면 데이터를 관리하는 과정에서 몇 가지 문제가 발생할 수 있습니다. 영어과목을 수강중인 학생을 조회하기 위해서 where 조건에 영어를 찾는 것이 아니라 like 절을 활용하여 찾아야 하는 번거로움이 있고  또한 영어 과목이 외국어로 변경된다면 일일이 찾아서 바꿔야 하는 번거로움이 있을 것입니다. 

WHERE 수강과목 = '영어'       (X)
WHERE 수강과목 LIKE '%영어%'  (O)

 
 

그렇기 때문에 위 처럼 하나의 컬럼에는 하나의 데이터만 저장하는 것을 제 1 정규화라고 합니다. 제 1 정규화라는 것은 제 제 2 정규화 제 3 정규화 등도 있겠죠? 그렇다면 정규화가 무엇이며 언제 필요한지, 또  다른 정규화 단계로는 어떤 것들이 있는지 알아보겠습니다!

 


1. 정규화(DB Normalization)의 개념

정규화란 하나의 엔터티(Entity)에 많은 속성을 넣게 되면, 해당 엔터티를 조회할 때마다 많은 양의 데이터가 조회될 것이므로 최소한의 데이터만을 하나의 엔터티에 넣는식으로 데이터를 분해하는 과정입니다. 엔터티를 상세화하는 과정이며 논리 데이터 모델링 수행 시점에서 고려됩니다.
 
혹시 엔터팅와 논리 데이터 모델링이 이해가 안 되신다면 이전 포스팅을 확인해 주세요!
2024.06.03 - [DB] - [DB] 데이터 모델링 완벽 이해하기!(엔터티, 속성, 관계 / 개념, 논리, 물리 모델링)

 

[DB] 데이터 모델링 완벽 이해하기!(엔터티, 속성, 관계 / 개념, 논리, 물리 모델링)

지금부터 여러분은 학습관리 시스템 LMS를 만들어야 하는 웹개발자 입니다. 그럼 가장 먼저 무엇을 시작해야 할까요?바로 홈페이지를 구성하고 자바를 활용해 코드를 짜고 하는것은 불가능 하겠

mcn97.tistory.com

 
정규화를 하지 않으면 무슨 문제가 발생할까요? 
 

2. 이상현상(Abnormality)

  • 정규화를 하지 않아 발생하는 현상(삽입이상, 갱신이상, 삭제이상)
  • 특정 인스턴스가 삽입될 때 정의되지 않아도 될 속성까지도 반드시 입력되어야 하는(삽입이상) 현상이 발생
  • 학과 정보만 삭제하면 되는데 관련된 학생의 정보까지도 함께 삭제되는 현상이 발생(삭제이상)

3. 정규화 단계

1. 제 1 정규화 (1NF)
제 1 정규화테이블의 컬럼이 원자성(한 속성이 하나의 값을 갖는 특성)을 갖도록 테이블을 분해하는 단계입니다. 처음에 들었던 예시가 있으니 간략히 설명 후 넘어가겠습니다. 
 
2. 제 2 정규화 (2NF)
제 2 정규화는 제 1 정규화가 진행한 테이블에 대해 완전 함수 종속을 만들도록 테이블을 분해하는 것이라고 많이들 설명을 하는데요. 이렇게 들어서는 도저히 이해가 되지 않습니다. 예시를 통해 보겠습니다. 

위와 같은 테이블처럼 '담당교수'라는 컬럼을 하나 추가하여 관리한다면 영어과목의 담당교수가 다른 사람으로 바뀌었을 때 테이블에서 '제임스'라는 이름을 하나하나 찾아서 전부 수정해야 하기 때문에 성능에 저하를 일으키게 됩니다.
 
지금은 데이터가 4건밖에 되지 않지만 수강생이 100명, 1000명으로 늘어날수록 작업은 많아지게 됩니다. 위 테이블에서 담당교수라는 정보는 학생이 수강한 과목에 대한 테이블 정보와는 내용을 나누어 관리를 할 필요가 있습니다.
 
쉽게 말하면 제 2 정규화는 현재 테이블의 주제와 관련 없는 컬럼을 다른 테이블로 빼는 작업이라고 할 수 있습니다. 
 
주제와 관련없는 컬럼을 뺀다는 것은 무엇을 의미할까요?
 
이 개념을 이해하기 위해서는 복합키(Composite key)를 이해할 필요가 있습니다. 복합키는 테이블에서 유일한 식별자를 지정하기 위해 두 개 이상의 컬럼을 지정하는 것을 말합니다. 위 테이블에서는 기존에 기본키로 사용하던 학번만으로는 유일한 행을 식별할 수가 없습니다.  (학번 + 수강과목) 두 개의 컬럼이 합쳐진다면 가능하겠죠. 이럴 때 복합키를 사용합니다.
 
관련 없는 컬럼을 테이블 뺀다는 것은 복합키를 구성하는 두 개의 컬럼 중 하나에만 대응이 되는 것을 뺀다는 의미입니다.
 
담당교수는 학번에 의해서는 정해지지 않고 수강과목에 대해서만 결정되기 때문에 아래의 테이블들과 같이 분리할 수 있습니다. 

이제 영어과목의 담당교수가 바뀐다고 하더라도 수강과목 테이블에서만 이름을 바꿔주면 학생테이블의 데이터는 따로 수정할 필요가 없으며 제 2 정규화가 적용이 된 테이블이라고 할 수 있습니다.
 
단점은 학생 테이블만 보고는 국어과목을 수강하는 신형만 학생의 담당교수를 조회(select)할 수 없다는 것입니다. 이는 나중에 학습할 조인(Join)을 통해 데이터를 조회해야 합니다. 
 
3. 제 3 정규화 (3NF)
제 3 정규화는 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리하는 것입니다. 이행적 종속성이란 A -> B, B -> C의 관계가 성립할 때, A -> C 가 성립되는 것을 말합니다. 이러한 경우 (A, B)의 테이블과 (B, C)로 분리하는 것이 제 3 정규화입니다. 역시나 이렇게 글로 봐서는 너무 어렵죠? 아래에 예시가 있습니다.
 

위에서 사용하던 수강과목 테이블을 살짝 수정하여 이번에는 담당교수의 출신대학이라는 컬럼이 추가되었습니다.  이 테이블에서 행을 식별할 수 있는 기본키(Primary Key)는 수강과목입니다.
 
하지만 새로 추가된 출신대학 컬럼과 수강과목은 전혀 상관이 없습니다.
 
위에서 말한 관계(A -> B, B -> C, A->C)대로 수강과목에 의해 담당교수가 정해지고 담당교수에 의해 출신대학이 정해지는 구조입니다. 이런 경우 제 3 정규화를 통해 데이터를 관리할 수 있습니다. 
 
이 외에도 BCNF(Boyce-Codd Normal Form) 정규화, 제 4 정규화, 제 5 정규화가 있지만 대부분 제 3 정규화 까지만 진행하기 때문에 간단히 정의정도만 적고 마치겠습니다.
 
BCNF 정규화는 모든 결정자가 후보키가 되도록 테이블을 분해하는 것입니다.
 
제 4 정규화는 여러 컬럼들이 하나의 컬럼을 종속시키는 경우에 분해하여 다중값 종속성을 제거하는 것을 말합니다.
 
제 5 정규화는 조인에 의해서 종속성이 발생되는 경우 분해하는 것입니다. 


4 . 반정규화 = 역정규화(De-Normalization)의 개념

위에서 설명한 정규화와는 반대되는 의미로 반정규화라는 용어가 있습니다. 데이터베이스의 성능 향상을 위하여 데이터 중복을 허용하고 조인을 줄이는 데이터베이스 성능 향상 방법으로 조회(SELECT) 속도를 향상시키지만, 데이터 모델의 유연성은 낮아지게 됩니다. 

※ 정규화를 수행하지 않은 '비정규화'와는 다른 개념

 

그렇다면 반정규화 언제 수행할까요?

  • 정규화에 충실하여 활용성은 향상되지만 수행 속도가 느려지는 경우
  • 다량의 데이터를 자주 처리해야 하는 경우
  • 특정 범위의 데이터만 자주 처리하는 경우
  • 통계와 같은 요약/집계 정보가 자주 요구되는 경우
반응형