개발노트

19. [MS-SQL] 정규화 역정규화 사이에서 고민 본문

DB/MS-SQL

19. [MS-SQL] 정규화 역정규화 사이에서 고민

mroh1226 2024. 6. 19. 00:22
반응형

현재 새로운 요청으로 DA를 하게 되었고 정규화와 역정규화 사이에서의 고민을 담아봅니다.

 

고민에 앞서 우선, 정규화와 역정규화 정의를 살펴봅니다.

(무엇이든 주장에는 근거가 있어야한다. 라고 생각하기 때문에 어떤 주장을 하든  그 주장의 근거에 대해서 알아 봅니다.)


정규화 (Normalization)

정규화는 데이터베이스를 설계할 때 데이터의 중복을 줄이고 데이터 무결성을 유지하기 위해 테이블을 구조화하는 과정입니다. 정규화의 주요 목적은 데이터의 중복을 최소화하고 데이터 일관성을 유지하는 것입니다. 정규화는 여러 단계로 나뉘며, 각 단계는 정규형(Normal Form)으로 알려져 있습니다.

  1. 제1정규형(1NF, First Normal Form):
    • 모든 테이블의 열이 원자값(Atomic Value)을 가져야 합니다. 즉, 각 열은 하나의 값만을 가져야 합니다.
  2. 제2정규형(2NF, Second Normal Form):
    • 1NF를 만족하면서 기본키가 아닌 모든 열이 기본키에 대해 완전 함수 종속성을 가져야 합니다. 즉, 부분 종속성(Partial Dependency)을 제거해야 합니다.
  3. 제3정규형(3NF, Third Normal Form):
    • 2NF를 만족하면서 기본키가 아닌 모든 열이 기본키에 대해 이행적 종속(Transitive Dependency)을 가지지 않아야 합니다.
  4. 보이스-코드 정규형(BCNF, Boyce-Codd Normal Form):
    • 3NF를 강화한 형태로, 테이블에 모든 결정자가 후보키가 되도록 합니다.

정규화를 통해 데이터의 중복이 줄어들고, 데이터베이스의 일관성과 무결성이 향상됩니다.

하지만 지나치게 정규화를 하면 데이터베이스의 성능이 저하될 수 있습니다.


역정규화 (Denormalization)

역정규화는 정규화된 데이터베이스를 의도적으로 다시 중복시키는 과정입니다.

이는 성능 향상을 위해 특정 데이터를 중복 저장하거나, 데이터베이스 접근 속도를 높이기 위해 일부 데이터를 결합하는 것을 의미합니다.

역정규화는 다음과 같은 경우에 유용할 수 있습니다:

  1. 읽기 성능 향상:
    • 빈번하게 조회되는 데이터에 대해 JOIN 연산을 줄이기 위해 테이블을 결합합니다.
  2. 복잡한 쿼리 간소화:
    • 자주 사용되는 복잡한 쿼리를 간소화하여 응답 시간을 줄입니다.
  3. 속도 우선 시스템:
    • 데이터 무결성보다 조회 성능이 더 중요한 시스템에서 사용됩니다.

정규화와 역정규화의 균형

효율적인 데이터베이스 설계는 정규화와 역정규화 사이의 적절한 균형을 찾는 것입니다. 정규화를 통해 데이터 일관성과 무결성을 유지하면서, 필요에 따라 역정규화를 통해 성능을 최적화해야 합니다. 이 균형을 맞추기 위해서는 데이터베이스의 용도, 쿼리 패턴, 성능 요구사항 등을 종합적으로 고려해야 합니다.

이러한 개념을 이해하고 데이터베이스 설계에 적용함으로써, 보다 효율적이고 안정적인 데이터 관리를 할 수 있습니다.


 

현재의 상황 예시, 실무에서 사용될 데이터가 어떻게 조회되어야 효율적인지 고민을 해봅니다.


정규화된 테이블 2개

학생 테이블

학생 ID 이름
1 홍길동
2 김철수

성적 테이블

학생 ID 과목 점수
1 수학 85
1 영어 90
2 국어 88
2 과학 78

 

이렇게 과목 응시가 서로 다를경우는 정규화가 효율적이지만, 만약 모든학생의 응시 과목이 전부 같고 자주 조회되는 데이터라면,
역정규화로 합치는게 더욱 효율적일것입니다.

매번 JOIN을 해야하는 상황을 피할 수 있습니다.


역정규화된 테이블
학생ID 이름 수학 영어 국어 과학
1 홍길동 85 90 50 60
2 김철수 90 75 88 78

이와 같이, 모든 학생이 동일한 과목을 응시하고 데이터를 자주 조회해야 하는 경우에는 역정규화가 더 효율적입니다. 이를 통해 조회 성능을 최적화할 수 있습니다. 반면, 학생마다 응시 과목이 다르면 정규화된 구조가 데이터 중복을 줄이고 무결성을 유지하는 데 더 유리합니다.

 

단, 과목이 늘어날 경우도 생각해야합니다. ALTER 를 사용하여 칼럼을 늘리고 그로 인한 영향들도 생각해야함


 

[역정규화의 입장]

1. 과목은 변하지않으며, 각각의 과목 점수는 필수적이다.

2. 자주 조회되는 데이터다.

3. JOIN을 매번 걸어줄 필요가 없다.

 

[정규화의 입장]

1. 과목이 추가되면 테이블 변경 > 프로시저 변경 > 프로그램 화면 변경 등 고려해야할 점이 많다.

(정규화의 경우 과목이 추가될 경우 과목만 추가 하면됨)

2. 특정 과목만 응시하는 경우가 생긴다면 하나의 과목 점수를 추가 할 때도 모든 과목 응시와 같은 저장공간의 낭비된다.

4. 역정규화되어있는 데이터 조회가 자주 일어나는지?

 

결론은, 어떤것이 매번 맞다고 할 수 없지만 현재 사용중인 DB를 이해하고 모든 상황을 고려하고, 갈등을 최소화 시킬 수 있는 방안이 필요하다고 생각합니다.

반응형
Comments