본문 바로가기
인공지능/데이터분석

데이터베이스 정규화 (Normalization)

by hyunji00pj 2024. 10. 22.

데이터 정규화(Normalization)란?

데이터를 효율적으로 저장하고 중복을 최소화하며 데이터 무결성을 유지하기 위한 과정이다. 중복된 데이터를 허용하지 않음으로써 용량을 줄이고 무결성 (Integrity)을 유지하는 것이다.
일반적으로 정규화는 여러 단계로 나뉘며 각 단계는 데이터의 중복성을 줄이고  논리적 구조를 개선한다
    

정규화의 장점

  • 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있다.
  • 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
  • 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킨다.

정규화의 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아진다.
  • 질의에 대한 응답 시간이 느려질 수도 있다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 
  • 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다.
  • 만약 조인이 많이 발생하여 성능 저하가 나타나면 비정규화를 적용할 수도 있다.

출처: https://code-lab1.tistory.com/48 [코드 연구소:티스토리]


1. 제1정규형(1NF,first normal form)
    - 테이블 내 모든 열의 값이 원자값이어야 함
    - 각 셀의 하나의 값만 있어야 하며, 중복된 데이터 값은 허용하지 않는다

 

간단히 아래의 테이블을 통해 설명 하겠다   
2번째 열에 데이터가 두개가 있으므로 제 1정규형에 만족하지 못한다 

위 테이블을 제 1 정규형으로 고친다면 아래와 같이 분해하면 된다

2. 제2정규형
    - 1FN( 제 1 정규형 )을 만족하면서, 기본키 키에 대해 부분 함수 종속이 없어야함
    - 테이블의 기본키 일부에만 종속되는 속성은 제거

부분 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안된다는 것이다.

 

조금 어렵지만 테이블을 통해 예시를 들면 이해가 빠르다.

위의 테이블을 보면  '학생ID'가 주요키로 사용되고 있다. '강사' 데이터는 '학생ID'와 직접적인 관계가 없이 '과목'에 종속적인 관계를 보인다. 즉, 강사는 학생에 대한 정보보다는 학생이 듣는 과목에 종속된 정보이다. 이러한 형태로 데이터를 저장하면 중복된 데이터가 많아지고, 갱신 이상(anomaly)이 발생 할 수 있다.

 

예)

  • 같은 과목을 가르치는 강사가 변경될 경우, 모든 관련 레코드를 갱신해야 한다
  • 특정 과목을 듣는 학생이 없을 경우, 그 과목의 강사 정보를 저장할 수 없다.

위 문제를 해결하기 위해 아래와 같이 테이블을 분리하면 각 테이블은 제 2 정규화를 만족하며, 데이터 중복을 최소화하고 갱신 이상을 방지할 수 있다.


     
3. 제3정규형
    - 2NF를 만족하면서, 기본키가 아닌 속성들이 서로 종속 관계에 있지 않아야 함
    - 이행적 함수 종속을 제거해야 함
이행적 종속이란 A > B, B > C 일때 A > C가 성립하면 이행 종속이라 한다.

 

아래 테이블의 문제점을 찾아보자

바로 '우편번호'가 '도시'에 종속되어 있다는 점이다. '도시'가 바뀌면 '우편번호'도 바뀌어야 하며, 이는 '도시'와 '우편번호' 사이에 이행적 종속성(transitive dependency)이 있음을 의미합니다. 이러한 종속성은 제 3정규화를 위반한다

위의 문제를 해결하기 위해 제 3 정규화를 적용하여 다음과 같이 테이블을 분리 할 수 있다

위와 같이 분리하면 '도시' 정보가 변할 때마다 '우편번호'를 쉽게 갱신할 수 있으며, '학생 테이블'에서는 '도시' 정보만을 관리하여 데이터 중복과 갱신 이상을 방지할 수 있다. 각 학생의 도시 정보는 '도시 테이블'을 참조하여 우편번호를 알 수 있다.


4. 비정규화
    - 정규형에 일치하게 되어 있는 테이블을 정규형을 지키지 않는 테이블로 변경
    - 테이블을 조회하는 용도로 사용하거나, 너무 데이터가 많이 나뉘어 저하한다면, 비정규화를 하여 테이블을 다루는 것이 효과적일 수 있다
    - 어떤 작업을 수행하는지, 어떤 데이터를 사용하는지에 따라 적절한 정규화를 하는 것이 좋다

 

간단히 말하자면 정규화된 테이블을 읽기 성능 향상을 위해 테이블을 다시 합치는 방법이라고 보면 된다.

위 테이블을 확인 해보자

만약 내가 3교시 선생님의 강의와 수강료를 알고 싶다면 정규화된 테이블에서는 <강사> 테이블에서 [강의시간,이름,담당수업] 을 확인하고,<수업> 테이블에서 [수업코드] 를 확인하고, <수강료> 테이블에서 [수강료] 를 확인해야 한다.

 

우리가 눈으로 볼 땐 테이블을 옮겨 다니며 하나씩 찾아가지만 컴퓨터는 3가지 테이블을 같은 키로 JOIN 한 뒤 데이터 값을 찾는다 만약 테이블 개수가 훨씬 많거나 테아블 안에 데이터가 엄청 많으면 JOIN 시간이 훨씬 늘어나 데이터 읽기 효율성이 떨어진다.

 

해서 아래 <시간> 테이블처럼 비정규화 테이블로 변경하면 JOIN을 할 필요가 없어 데이터 읽기 시간이 단축 된다.

 

하지만 비정규화시 고려해야할 단점이 있다

  1. 데이터 무결성 위험: 중복된 데이터가 증가함에 따라 데이터 간의 일관성을 유지하는 것이 어려워질 수 있다. 이는 데이터 무결성 문제로 이어질 수 있다.
  2. 유지보수의 어려움: 데이터가 중복되어 저장되기 때문에, 데이터를 갱신할 때 여러 테이블을 동시에 갱신해야 할 필요가 생긴다. 이는 유지보수의 복잡성을 증가시킨다.

따라서 정규화 비정규화를 데이터베이스의 사용 사례와 요구 사항에 따라 성능과 데이터 무결성 간의 균형을 찾는 것이 중요하다.