When and How You Should Denormalize a Relational Database 정리한 내용
웹사이트의 속도가 빠를수록 검색 엔진에서 높은 순위를 차지하며 사용자 경험도 개선됩니다.
데이터베이스 최적화는 웹사이트 성능 향상에 필수적인 과정입니다. 일반적으로 개발자들은 데이터 중복을 줄이고 무결성을 향상시키기 위해 관계형 데이터베이스를 정규화합니다. 즉, 데이터베이스를 재구성하는 것입니다.
그러나 가끔은 정규화만으로는 충분하지 않을 때가 있습니다. 이런 경우, 성능 향상을 위해 개발자들은 데이터베이스를 비정규화하기도 합니다.
데이터베이스를 언제 비정규화해야 할까
정규화는 데이터베이스 설계의 첫 단계로, 데이터를 적절한 위치에 배치하여 무결성을 보장하고 업데이트를 용이하게 합니다. 이 과정은 중복을 제거하여 데이터 관리를 효율적으로 만듭니다. 그러나, 데이터가 여러 테이블에 분산되어 있으면, 쿼리가 복잡해지고 데이터 검색 속도가 느려질 수 있습니다.
반면, 비정규화는 데이터 검색 속도를 높이기 위해 동일한 데이터를 의도적으로 여러 위치에 저장하는 방법입니다. 이 방식은 데이터베이스의 응답 시간을 단축시키지만, 업데이트 과정에서 일관성 유지에 더 많은 노력을 요구할 수 있습니다.
따라서, 비정규화는 검색 성능을 중시하는 특정 상황에서 선택적으로 사용되어야 합니다. 데이터의 중복을 허용함으로써 빠른 검색을 제공하지만, 데이터 관리의 복잡성과 오류 가능성을 증가시킬 수 있기 때문입니다.
1. 쿼리 성능 향상
정규화된 데이터베이스는 데이터의 무결성을 유지하기 위해 여러 테이블로 데이터를 분리합니다. 하지만, 이 구조에서는 쿼리가 여러 테이블에 걸쳐 조인을 수행해야 하기 때문에 쿼리 성능이 저하될 수 있습니다. 이 문제를 해결하기 위해, 자주 사용되는 데이터를 부모 테이블에 복사하여 중복을 허용함으로써 조인을 줄일 수 있습니다. 이 방법은 데이터 검색 속도를 향상시키지만, 데이터 동기화에 주의가 필요합니다.
2. 운영 편의성 증가를 위한 데이터 베이스의 비정규화
정규화 과정에서는 계산된 값들을 따로 저장하지 않고, 필요할 때마다 실시간으로 계산합니다. 이는 데이터베이스의 쿼리 실행 속도를 늦출 수 있습니다. 비정규화를 통해 계산된 값을 사전에 테이블에 저장함으로써, 개발자들이 복잡한 계산 로직을 이해하지 않고도 보고서나 쿼리를 쉽게 작성할 수 있도록 도움을 줍니다.
3. 리포팅 가속화와 용이성 향상
애플리케이션은 종종 다양한 분석 및 통계 정보를 제공해야 할 필요가 있습니다. 정규화된 데이터베이스 구조에서는 보고서 작성 시 많은 계산과 데이터 집계가 필요하여, 이 과정이 시스템의 성능을 저하시킬 수 있습니다. 비정규화를 통해 예를 들어, 사용자 테이블에 연간 누적 매출 요약 같은 중요한 정보를 미리 계산하여 저장함으로써, 리포팅을 빠르고 쉽게 만들 수 있습니다. 이러한 접근 방식은 데이터 처리 시간을 단축시켜 성능 저하를 최소화하는 데 도움이 됩니다.
데이터베이스 비정규화 기법 요약
1. 유도 가능한 데이터 저장
자주 계산해야 하는 값을 미리 저장하여 조회 속도를 높인다.
- 장점: 매번 계산할 필요 없음, 조회 성능 향상
- 단점: 원본 데이터 변경 시 재계산 필요, 데이터 불일치 가능성
- 예시: 이메일 메시지 시스템에서 users_received_count를 추가하여 수신자가 모두 삭제되면 메시지를 자동 삭제하도록 함.
2. 사전 조인된 테이블 사용
조인을 최소화하기 위해 비즈니스적으로 중요한 컬럼이 아닌 값을 테이블에 추가한다.
- 장점: 조인 없이 빠른 조회 가능
- 단점: 업데이트 시 추가적인 DML((Data Manipulation Language) 필요, 추가 저장 공간 사용
- 예시: User_messages 테이블에 category_name 컬럼 추가 → 만약 Categories 테이블에서 category_name이 변경되면, User_messages 테이블의 category_name도 일괄적으로 업데이트되어야 한다.
3. 하드코딩된 값 사용
변하지 않는 값을 참조 테이블 대신 애플리케이션에서 하드코딩하여 조회 속도를 향상시킨다.
- 장점: 참조 테이블 조인 불필요
- 단점: 값 변경 시 코드 수정 필요
- 예시: User_kinds 테이블 대신 사용자 유형을 하드코딩하고, 체크 제약 조건을 설정.
4. 마스터 테이블에 상세 정보 포함
상세 테이블의 레코드 개수가 적거나 마스터 테이블과 함께 조회될 경우, 상세 데이터를 마스터 테이블에 포함한다.
- 장점: 조인 불필요, 저장 공간 절약 가능
- 단점: DML 복잡성 증가
- 예시: Users 테이블에 message_space_allocated, message_space_available 등의 저장 공간 제한 정보를 추가.
5. 특정 세부 정보 반복 저장
특정한 단일 레코드를 자주 조회하는 경우, 해당 값을 별도 외래키 컬럼에 저장하여 조인을 최소화한다.
- 장점: 단일 레코드 조회 시 조인 필요 없음
- 단점: 데이터 불일치 가능성 존재
- 예시: Messages 테이블에 first_attachment_name을 추가하여 첫 번째 첨부파일 정보를 빠르게 조회.
6. 단축 키(short-circuit key) 추가
마스터-디테일 관계가 3단계 이상일 때, 최상위 레벨과 최하위 레벨을 직접 연결하는 단축 키를 추가한다.
- 장점: 조인 개수 감소
- 단점: 외래 키 증가, 값 일관성 유지 필요
- 예시: Messages 테이블에 Users 테이블의 기본 키를 직접 추가하여 Categories 테이블을 거치지 않고 조회 가능하게 함.
비정규화의 단점 및 고려사항
비정규화는 성능을 향상시키지만 여러 단점이 존재함.
- 추가 저장 공간 필요: 데이터 중복으로 인해 저장 공간 증가
- 문서화 필요: 비정규화된 데이터 구조는 철저히 문서화해야 유지보수 가능
- 데이터 이상 발생 가능: 중복된 데이터의 동기화 필요
- 추가 코드 필요: 비정규화로 인해 더 많은 업데이트 로직 요구
- 쓰기 성능 저하: 조회 속도는 빨라지지만, 데이터 수정 및 삽입이 느려질 수 있음
비정규화 적용시 주의할 점
- 전체 데이터베이스가 아닌 특정 성능 저하 부분만 비정규화할 것
- 애플리케이션의 논리적 설계를 철저히 분석한 후 적용
- 데이터 변경 빈도를 고려하여 유지보수가 가능한지 검토
- 쿼리 최적화를 통해 성능 문제를 해결할 수 있는지 먼저 확인
- 필요할 경우 가장 적절한 데이터 저장 기법을 선택하여 적용
'DataBase > Database 지식 기록' 카테고리의 다른 글
[ DBeaver ] 데이터베이스 생성시 입력정보 (0) | 2024.04.24 |
---|---|
유효성, 예외처리 [Error] : Data too long for a cloumn (0) | 2023.11.05 |
Sequelize을 이용한 Transaction (0) | 2023.10.05 |
트랜잭션(Transaction) (0) | 2023.10.04 |
데이터베이스 모델링 : 모델 간의 관계 (0) | 2023.09.30 |