데이터베이스 정규화 vs 비정규화

Hoo-Sung.Lee·2024년 1월 25일
0

Database

목록 보기
12/18

이번에는 데이터베이스 비정규화에 대해서 알아보겠습니다. 무결성 있고, 일관성있는 설계를 하기 위해서는 정규화 원칙들을 잘 지켜야한다고 배웠습니다.
1NF->2NF->3NF->BCNF(Boyce-Codd Normal Form)를 거쳐 정규화 과정을 거칩니다. 이렇게 열심히 정규화를 시킨 구조 왜 일부로 깨뜨리려고 하는지에 대해 알아보겠습니다.


정규화 vs 비정규화(반정규화) 데이터베이스

정규화 데이터베이스(normalized database)는
중복을 최소화하도록 설계된 데이터베이스를 말한다.

비정규화 데이터베이스(denormalized database)는
읽는 시간을 최적화하도록 설계된 데이터베이스를 말한다.

정규화 데이터베이스

  • 같은 데이터는 데이터베이스 내에 하나 정도만 놓으려고 노력한다.
  • 하지만 상당수의 일상적 질의를 처리하기 위해 JOIN을 많이 하게 되는 단점이 있다.

비정규화 데이터베이스

  • 관계형 데이터베이스(relational database)를 사용하는 경우,
  • JOIN 연산의 비용을 줄일 수 있다.
    비정규화는 높은 규모 확장성을 실현하기 위해 자주 사용되는 기법이다.

비정규화(Denormalization, 반정규화)란 무엇인가?

하나 이상의 테이블에 데이터를 중복해 배치하는 최적화 기법이다.

시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로, 의도적으로 정규화 원칙을 위배하는 행위이다.

🚁 예를 들어, Courses와 Teachers라는 테이블로 이루어진 정규화된 데이터베이스를 생각해 보자. Courses 테이블에는 teacherlD를 둘 수는 있어도, teacherName이라는 필드를 두지는 않을 것이다. 따라서 강좌 정보와 교사 이름을 함께 나열하고 싶은 경우에는 두 테이블을 조인해야 한다.
어떤 면에서는 멋진 방법이다. 교사가 자신의 이름을 바꿀 경우, 한 곳의 데이터만 갱신하면 된다.

하지만 이 방법의 단점은 테이블이 아주 클 경우 조인을 하느라 불필요할 정도로 많은 시간을 낭비하게 된다는 것이다.

비정규화는 다른 타협안을 내놓음으로써 그런 단점을 해소하고자 한다. 어느 정도의 데이터 중복이나 그로 인해 발생하는 데이터 갱신 비용은 감수하는 대신 조인 횟수를 줄여 한층 효율적인 쿼리를 날릴 수 있도록 하겠다는 것이다.

장점

  • 빠른 데이터 조회
    -> 조인 비용이 줄어들기 때문
  • 살펴볼 테이블이 줄어들기 때문에 데이터 조회 쿼리가 간단해짐
    -> 따라서 버그 발생도 줄어든다.

단점

  • 데이터 갱신이나 삽입 비용이 높다.
  • 데이터 갱신 또는 삽입 코드를 작성하기 어려워짐
  • 데이터의 일관성이 깨질 수 있다. 어느 쪽이 올바른 값인가?
  • 데이터를 중복하여 저장하므로 더 많은 저장 공간이 필요하다.

비정규화 대상

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

대부분의 대규모 IT 업체의 경우처럼, 규모 확장성(scalability)을 요구하는 시스템의 경우 거의 항상 정규화된 데이터베이스와 비정규화된 데이터베이스를 섞어 사용한다.

주의점

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

비정규화하는 방법

1. Trigger 사용

  • 데이터베이스 트리거를 사용하여 학생 테이블에서 이름이 변경될 때 자동으로 course 테이블을 업데이트할 수 있습니다.
  • 예를 들어, 학생 테이블의 AFTER UPDATE 트리거를 생성하여 해당 학생 ID에 대한 course 테이블의 student_name을 업데이트할 수 있다.

2. 일괄 업데이트 스크립트 사용

  • 주기적으로 실행되는 일괄 업데이트 스크립트를 만들어 학생 테이블의 변경 내용을 기반으로 course 테이블을 업데이트할 수 있습니다.
  • 이 스크립트는 변경된 학생 이름을 기준으로 course 테이블을 업데이트합니다.

3. 실시간 업데이트 매커니즘 사용

  • 학생 이름이 변경될 때 실시간으로 해당 변경을 감지하고 course 테이블을 업데이트하는 메커니즘을 구현할 수 있다.
  • 이를 위해 데이터베이스나 어플리케이션에서 변경 이벤트를 감지하여 자동으로 업데이트할 수 있다.
profile
Working towards becoming Backend-Developer

0개의 댓글