정규화

관계형 데이터베이스 설계 시, 데이터 중복과 갱신 이상을 최소화하기 위해서 데이터를 구조화하는 작업이다.

제 1 정규형 (1NF)

제 1 정규형(1NF) 은 모든 도메인은 원자(Atomic) 값으로 구성되어야 한다는 내용이다. 쉽게 말해 하나의 Column 에는 두개 이상의 값이 오면 안된다는 것을 의미한다.

  • 수강과목이라는 Column 의 값의 범위. 즉, 도메인은 , 으로 구분되어야 할 것이 아니라 원자값으로 구성되어야 한다.

Note

Domain 은 데이터베이스에서 컬럼이나 속성(attribute)에 허용되는 값의 범위 또는 데이터 타입을 정의한다. 즉, 특정 Column 에 저장될 수 있는 값들의 집합을 의미한다.

제 2 정규형

제 2 정규형 (2NF) 은 부분 함수 종속성 제거. 즉, 기본키에 종속적인 데이터를 분리한다는 내용이다. 쉽게 말해 현재 기준 테이블과 관계없는 Column 을 다른 Table 로 분리 과정을 말한다.

  • 학번 이 학생을 구분할 수 있는 PK 라고 가정했을 때, 학번에 종속적인 이름, 학년, 학과 를 따로 학생으로 분리할 수 있다.
  • 과목 코드 가 과목을 구분할 수 있는 PK 라고 가정했을 때, 과목 코드에 종속적인 과목명, 학점 을 따로 과목으로 분리할 수 있다.
  • 제 2 정규형의 결과로 데이터의 중복이 사라지는것은 물론이고, 나중에 Update 를 할 때도 하나의 테이블만 수정하면 되는 이점이 있다.

정리

정리하면 2NF 는 PK 가 아닌 모든 Attribute 가 PK 에 완전 함수 종속되도록 릴레이션을 분해하는 과정이며, 하나의 Relation 이 두개 이상의 PK 로 구성되었을 때 고려하면 된다.

제 3 정규형

제 3 정규형 (3NF) 은 2NF 가 적용되어있는 상태에서 기본키가 아닌 모든 속성(Column) 에서 이행적 함수 종속을 제거한다는 내용이다. 쉽게 말해 일반 Column 에만 종속된 Column 을 다른 Table 분리하라는 의미이다.

  • 아래와 같이 과목명이 정해지면 강의실이 정해지고, 강의실에 따라 컴퓨터 유무와 최대인원이 정해지는 상황에서 3NF 를 적용할 수 있다.

장점

데이터 중복 감소

  • 동일한 데이터를 여러 번 저장하는 것을 방지한다. 이는 데이터베이스의 크기를 줄이고, 저장 공간을 효율적으로 사용할 수 있게 한다.

데이터 무결성 보장

  • 데이터가 일관되게 유지된다. 하나의 데이터 변경이 모든 관련된 항목에 일관되게 반영되기 때문에 무결성이 보장된다.

데이터 갱신 이상(Anomalies) 방지

  • 삽입, 삭제, 갱신 시 발생할 수 있는 이상 현상(Anomalies)을 줄일 수 있다. 예를 들어, 중복 데이터가 없다면 데이터 수정 시 모든 관련 항목을 수정할 필요가 없으므로 갱신 이상이 발생하지 않게 된다.

데이터 구조의 명확화

  • 테이블 간의 관계가 명확해져 데이터 구조가 보다 직관적이고 이해하기 쉬워진다. 이는 쿼리를 작성할 때도 유리해진다.

단점

복잡한 쿼리

  • 정규화로 인해 테이블이 여러 개로 분리되기 때문에, 데이터를 조회하기 위해 여러 테이블을 조인(join)해야 하는 복잡한 쿼리가 필요할 수 있다. 이로 인해 성능 저하가 발생할 수 있다.

성능 저하

  • 정규화된 데이터베이스는 데이터를 삽입, 삭제, 갱신할 때도 여러 테이블을 조작해야 할 수 있기 때문에 성능이 저하될 수 있다. 특히나 매우 큰 데이터셋에서는 이 문제가 더 심각해질 수 있다.

대응책

조회를 하는 SQL 문장에서 Join 이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에는 반정규화를 적용하는 전략이 필요하다.

반정규화

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

반정규화

  • 디스크 I/O 량이 많아서 조회 시 성능이 저하되거나, 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상될때 진행한다.
  • Column 을 계산하여 조회할 때, 성능이 저하될 것이 예상되는 경우에 진행한다.

일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

반정규화의 대상

  1. 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
  2. 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
  3. 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

주의점

반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다. 또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.