[F-Lab 멘토링 학습]

데이터베이스의 정규화와 역정규화

everydeveloper 2023. 10. 10. 22:43

데이터베이스의 정규화와 역정규화

데이터베이스의 정규화

데이터베이스의 정규화는 데이터베이스 설계 과정에서 중요한 단계 중 하나입니다. 정규화의 주 목적은 데이터 중복을 최소화하고 데이터 구조를 효율적으로 만드는 것입니다. 이를 통해 데이터베이스에서 발생할 수 있는 여러 문제점을 미리 예방합니다.

정규화의 목적

  • 데이터 중복 제거
  • 데이터 무결성 유지
  • 삽입, 삭제, 수정 시 발생할 수 있는 문제점(삽입 이상, 삭제 이상, 갱신 이상 등) 방지
  • 쿼리 성능 최적화

정규화 과정

  1. 제1정규형(1NF): 모든 컬럼이 원자적(atomic) 값만을 갖도록 합니다.
  2. 제2정규형(2NF): 제1정규형을 만족하면서 부분 함수 종속성(partial functional dependency)을 제거합니다.
  3. 제3정규형(3NF): 제2정규형을 만족하면서 이행 함수 종속성(transitive functional dependency)을 제거합니다.
  4. BCNF(Boyce-Codd Normal Form): 제3정규형을 만족하면서 모든 결정자가 후보 키(candidate key)가 되도록 합니다.
  5. 4NF, 5NF 등: 더 복잡한 종속성과 다중 값 종속성(multivalued dependency) 등을 다룹니다.

예시

다음과 같은 테이블이 있을 경우,

StudentID Subject Professor

1 Math Kim
1 Science Lee
2 Math Kim
  • 1NF: Professor와 Subject가 원자적 값입니다. 따라서 이미 1NF를 만족합니다.
  • 2NF: StudentID와 Subject가 복합키(composite key)입니다. 여기서 Professor는 복합키에 함수적으로 종속되므로 2NF를 만족합니다.
  • 3NF: Professor는 복합키에만 종속되고, 이행 함수 종속성이 없으므로 3NF도 만족합니다.

이처럼 정규화를 거치면 데이터베이스의 효율성과 유지 보수성이 높아집니다. 하지만 정규화가 과도하면 쿼리의 복잡성과 성능 저하를 초래할 수 있으니 적절한 수준에서의 정규화가 중요합니다.

데이터베이스의 정규화에 대한 설명이 조금 더 필요하신 것 같습니다. 정규화는 여러 단계를 거치며 각 단계마다 목표와 처리해야 할 문제가 다릅니다. 다음은 각 단계별로 무엇을 해야 하는지에 대한 추가 설명입니다.

제1정규형 (1NF)

  • 목적: 각 컬럼이 원자적인 값만을 가져야 합니다.
  • 예시: 주소 컬럼이 '도시, 구, 동' 으로 한 컬럼에 들어가 있는 경우, 이를 '도시', '구', '동' 으로 나눕니다.

제2정규형 (2NF)

  • 목적: 부분 함수 종속성을 제거합니다.
  • 예시: '학생ID', '과목' 이라는 복합키에서 '교수'가 '과목'에만 종속적인 경우, 별도의 테이블을 만들어 '과목'과 '교수'를 묶습니다.

제3정규형 (3NF)

  • 목적: 이행 함수 종속성을 제거합니다.
  • 예시: '학생ID'가 '학과'에 종속되고, '학과'가 '학과장'에 종속된 경우, '학과'와 '학과장'을 별도의 테이블로 분리합니다.

BCNF (Boyce-Codd 정규형)

  • 목적: 모든 결정자가 후보 키여야 합니다.
  • 예시: 만약 '과목 코드'가 '과목 이름'을 결정한다면, '과목 코드'와 '과목 이름'은 별도의 테이블로 관리해야 합니다.

4NF, 5NF

  • 목적: 다중값 종속성, 조인 종속성 등을 처리합니다.
  • 예시: 하나의 '주문'에 여러 '제품'이 있고, 각 '제품'에 여러 '옵션'이 있는 경우, 이를 효과적으로 분리하여 저장합니다.

정규화는 데이터 중복을 최소화하므로 데이터의 무결성을 높이고, 삽입/삭제/갱신 이상을 방지할 수 있습니다. 그러나 너무 많이 정규화하면 테이블 간의 JOIN 연산이 많아져 성능이 저하될 수 있으므로 적절한 수준에서 정규화를 해야 합니다.

제 1정규형 (1NF)

  • 특징과 원리: 모든 컬럼이 원자적(atomic) 값만을 가지며, 각 행은 고유한 키로 식별됩니다.
  • 외우는 법: 1NF는 '1'과 '원자' 사이에 연관성을 떠올리면 좋습니다. "하나의 컬럼에 하나의 데이터"라는 문장을 생각해보세요.

제 2정규형 (2NF)

  • 특징과 원리: 1NF를 만족하며, 부분 함수 종속성이 없어야 합니다. 즉, 모든 속성은 전체 유일 키에 종속되어야 합니다.
  • 외우는 법: '2'를 두 개의 부분으로 생각하고, "두 부분 중 하나만에 종속되면 안 된다"라고 외워보세요.

제 3정규형 (3NF)

  • 특징과 원리: 2NF를 만족하고, 이행적 함수 종속성(transitive dependency)이 없어야 합니다.
  • 외우는 법: '3'과 '이행(Transitive)'의 첫 글자 'ㅌ'를 연관짓고, "3단계를 거치지 않고 직접 종속되어야 한다"라고 생각해보세요.

BCNF (Boyce-Codd Normal Form)

  • 특징과 원리: 3NF를 만족하며, 모든 결정자(determinant)가 후보 키(candidate key)이어야 합니다.
  • 외우는 법: BCNF의 'B'를 'Best'로, 'C'를 'Candidate'로 상상하고, "최고(Best)의 후보 키(Candidate)만이 결정자가 될 수 있다"고 외워보세요.

공통 외우는 법

  1. 실제 예제를 만들어 보세요: 간단한 데이터베이스 스키마를 만들고 각 정규형에 따라 변형해보면 더 잘 외워질 수 있습니다.
  2. 플래시카드 사용: 각 정규형의 정의와 특징을 작성한 카드를 만들고 반복적으로 복습하세요.
  3. 설명 연습: 다른 사람이나 스스로에게 정규화의 원리를 설명하면서 이해를 깊게 하세요.

이렇게 각 정규형의 특징과 원리를 연관성 있게 외우고 복습한다면, 더 잘 기억할 수 있을 것입니다.

데이터베이스의 역정규화

데이터베이스 설계에서 정규화가 데이터의 중복을 줄이고 무결성을 유지하는 데 중점을 둔다면, 역정규화(De-normalization)는 성능 향상이나 데이터 검색의 효율성을 높이는 데 목적을 둡니다. 역정규화는 정규화된 데이터베이스 스키마에 의도적으로 중복성을 도입하는 과정입니다.

역정규화의 목적

  • 쿼리 성능 향상: JOIN 연산이 많을 경우 성능이 저하될 수 있는데, 역정규화를 통해 이를 해결할 수 있습니다.
  • 데이터 접근성 증대: 특정 애플리케이션에서 요구하는 형태로 데이터를 미리 조합해 두면, 데이터 접근이 빨라집니다.
  • 복잡한 쿼리 간소화: 역정규화된 테이블에서는 복잡한 쿼리 작성을 줄일 수 있습니다.

역정규화의 단점

  • 데이터 무결성 문제: 중복된 데이터가 발생하기 때문에 데이터 무결성을 유지하는 것이 어려워집니다.
  • 유지보수 어려움: 중복성이 높아질수록 데이터의 갱신(삽입, 삭제, 수정)이 복잡해집니다.

역정규화 시 고려사항

  • 어떤 쿼리가 자주 사용되는지 분석합니다.
  • 어떤 테이블에 대한 JOIN 연산이 빈번한지 살펴봅니다.
  • 데이터 무결성을 어떻게 유지할 것인지 계획합니다.

실제 예제

예를 들어, 학생 테이블과 과목 테이블이 정규화되어 있다고 가정해보겠습니다. 성적 테이블은 학생ID와 과목ID를 외래키로 가지고 있을 것입니다. 여기서 매번 성적을 조회할 때마다 학생 테이블과 과목 테이블을 JOIN해야 하는 상황이 발생하면, 성능이 저하될 수 있습니다. 이럴 때 성적 테이블에 학생이름, 과목이름을 추가로 저장하여 JOIN 연산 없이도 필요한 정보를 얻을 수 있게 하는 것이 역정규화의 한 예입니다.

역정규화는 신중하게 수행되어야 하며, 정규화된 설계를 기반으로 특정 목적과 상황에 맞게 적용되어야 합니다.

역정규화의 단계

  1. 성능 분석: 어떤 쿼리가 느린지, 어떤 연산이 자주 발생하는지 분석합니다.
  2. 적용 대상 선택: 중복성을 도입할 테이블과 컬럼을 선택합니다.
  3. 데이터 무결성 계획: 중복성을 도입하더라도 데이터 무결성이 유지될 수 있는 방법을 계획합니다. 예를 들어, 트리거나 저장 프로시저를 사용할 수 있습니다.
  4. 변경 및 테스트: 실제로 데이터베이스 스키마를 변경하고, 성능 테스트를 수행합니다.
  5. 모니터링 및 유지보수: 적용 후에도 계속해서 성능을 모니터링하고 필요한 경우 추가적인 역정규화를 수행합니다.

주의사항

  • 데이터 무결성: 역정규화는 데이터 무결성에 위험을 줄 수 있으므로, 어떻게 이를 관리할 것인지에 대한 전략이 필요합니다.
  • 디스크 사용량: 중복 데이터를 저장하게 되므로 디스크 사용량이 증가할 수 있습니다. 따라서 저장 공간을 미리 고려해야 합니다.
  • 복잡도 증가: 쿼리는 단순해질 수 있지만, 데이터를 유지보수하는 과정이 복잡해질 수 있습니다. 예를 들어, 한 테이블에서 데이터가 변경되면, 그 변경이 다른 테이블에도 적용되어야 할 수 있습니다.

역정규화는 적절히 활용할 때 매우 유용하지만, 신중히 접근해야 하는 작업입니다. 특히 웹 개발 분야에서는 동적인 쿼리가 많이 사용되고, 빠른 응답 시간이 요구되기 때문에 역정규화를 적절히 활용하면 많은 이점을 볼 수 있습니다. 그러나 이 과정에서 데이터의 무결성을 해치지 않도록 주의해야 하며, 지속적인 모니터링과 유지보수가 필요합니다.