Normalization

2 분 소요

Database 정규화

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다.

정규화의 목적

데이터 베이스 정규화의 목적은 데이터 중복을 감소시키고 각종 상태 이상들을 방지하는데 있습니다. 정규화 규칙은 큰 테이블을 작은 테이블들로 쪼개고, 테이블 간 관계를 사용하여 엮습니다. 정규화를 통해 데이터 중복을 없애고 데이터가 논리적으로 저장되어있음을 보장할 수 있습니다.

상태 이상

사번 이름 주소 연락처 부서번호 부서명
E001 홍길동 뉴욕 010-1111-2222 D001 마법부
E002 김춘추 방콕 010-3213-0011 D002 국방부
E003 아인슈타인 안산 010-4321-1234 D003 과학부
E003 아인슈타인 안산 010-4321-1234 D004 교육부

삭제 이상

  • 한 튜플을 삭제시 연쇄적으로 다른 튜플이 삭제되는 이상입니다.
  • 위 예시 표에서 사번이 3인 사원의 row를 제거한다면 과학부에 대한 정보도 함께 사라져버립니다.

삽입 이상

  • 김춘추의 주소를 하나 더 추가하려고 합니다. 새로 추가되는 정보는 주소 뿐이므로 주소 이외의 정보, 연락처, 부서 정보는 모두 NULL값을 가지게 됩니다.

갱신 이상

  • 아인슈타인의 연락처를 변경하고 싶어 과학부 소속 정보의 연락처를 수정했지만 교육부 소속 정보의 연락처는 수정되지 않을 수 있습니다.

제 1 정규화

아래 두 조건을 만족하는 테이블은 제 1 정규화를 만족한다고 볼 수 있습니다.

  1. 테이블의 모든 셀은 단일 값을 가지고 있어야 합니다.
  2. 모든 record는 유일해야 합니다.

제 2 정규화

  1. 제 1 정규화를 만족
  2. 부분적 함수 종속 제거

아래의 테이블로 예시를 들겠습니다.

사원명 주소 연락처 부서명 부서인원
홍길동 뉴욕 010-1111-2222 마법부 100
김춘추 방콕 010-3213-0011 국방부 230
아인슈타인 안산 010-4321-1234 과학부 80
아인슈타인 안산 010-4321-1234 교육부 120

사원은 사원 이름과 부서명을 통해 결정지어질 수 있습니다. 사원의 정보인 주소와 연락처는 결국 (사원명, 부서명)에 종속됩니다.
그러나 부서 인원은 사원에 종속되는 것이 아닌 부서에 종속되는 것이므로 (사원명, 부서명)에 종속되는 것이 아닌 (부서명)에 종속됩니다.
이처럼 어떤 컬럼의 결정자의 일부 컬럼에만 종속되는 컬럼이 있는 경우 부분 함수 종속이 있다고 합니다.
이 부분 함수 종속을 제거한다면 아래와 같이 두개의 테이블로 쪼갤 수 있습니다. |사원명|주소|연락처|부서명| |—-|—|—-|—-| |홍길동|뉴욕|010-1111-2222|마법부| |김춘추|방콕|010-3213-0011|국방부| |아인슈타인|안산|010-4321-1234|과학부| |아인슈타인|안산|010-4321-1234|교육부|

부서명 부서인원
마법부 100
국방부 230
과학부 80
교육부 120

후보키의 일부에만 종속되는 경우를 확인하는 것이기 때문에 기본키가 단일 컬럼으로 이루어져있다면 제 2 정규화는 확인하지 않아도 됩니다.

제 3 정규화

  1. 제 2 정규화를 만족
  2. 이행적 함수 종속 제거
제조사 제조날짜 모델명 디자이너 이름 디자이너 주소
아오디 1997 a7000 홍길동 뮌헨
벤즈 2002 s001 김유신 취리히
현태 2012 아방떼 펠레 역삼

위 테이블의 후보키는 (제조사, 제조날짜, 모델명)이 됩니다. 제조 날짜와 디자이너 이름은 이 후보키에 종속됩니다.

그러나 디자이너 주소는 해당 후보키에 바로 종속되는 것이 아닌 후보키에 종속되는 디자이너 이름에 종속됩니다.

이를 이행적 함수 종속이라고 하고 이를 제거해준다면 아래와 같이 두개의 테이블로 분리할 수 있습니다.

제조사 제조날짜 모델명 디자이너 이름
아오디 1997 a7000 홍길동
벤즈 2002 s001 김유신
현태 2012 아방떼 펠레
디자이너 이름 디자이너 주소
홍길동 뮌헨
김유신 취리히
펠레 역삼

상태 이상 방지를 위해 정규화를 최소 3단계까지 진행하면 좋습니다. 그러나 정규화가 과도하게 진행된 경우 불필요하게 join 연산이 많아져 쿼리 성능을 저하시킬 수 있습니다. 이를 위해 반정규화를 진행해 줄 수 있습니다.

반정규화(비정규화)

반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 부리 등을 수행하는 데이터 모델링 기법 중 하나이다.

테이블에 정규화가 과도하게 진행되었다 판단하는 경우 역으로 테이블을 합쳐 반정규화를 진행합니다.

하지만 다시 반정규화를 하다 데이터의 무결성이 깨질 수 있고, 입력, 수정, 삭제 쿼리에 대한 응답 시간이 늦어질 수 있어 주의를 요합니다.

댓글남기기