728x90
SMALL
- 이번에는 데이터 모델을 정규화 및 반정규화하는 방법과, 트랜잭션, NULL에 대해서 알아보겠습니다!
정규화란?
- 정규화는 데이터베이스 설계의 핵심 과정으로, 중복을 최소화하고 데이터의 정합성(데이터의 정확성과 일관성을 유지하고 보장)을 위해 데이터를 구조화하는 방법입니다.
- 정규화를 통해 데이터를 여러 엔티티로 분리하여, 각 엔티티가 그 목적에 맞게 데이터를 보다 효율적으로 저장하도록 합니다.
- 일반적으로 정규화를 수행하면 데이터 처리 성능이 향상됩니다.
- 이제 정규화의 주요 단계들을 하나씩 살펴보도록 하겠습니다.
✅ 제1정규형
- 제1정규형은 엔티티의 모든 속성이 하나의 속성값(더 이상 분해할 수 없는 값)만을 포함하도록 구조화하는 것입니다.
- 즉, 각 속성에는 반복되는 그룹이나 배열이 없어야 하며, 각 인스턴스마다 유일한 키(식별자)가 있어야 합니다.
- 또한, 유사한 속성이 반복되는 경우도 1차 정규화의 대상이 됩니다.
✅ 제2정규형
- 제2정규형은 제1정규형을 만족하면서, 모든 일반 속성이 주식별자에 완전히 종속되는 것을 의미합니다.
- 이는 부분적 종속을 제거하여, 주식별자가 아닌 속성이 주식별자의 일부에만 종속되는 경우를 없애야 함을 뜻합니다.
- 그래서 주식별자가 복합식별자인 경우 부분적인 종속 관계가 생길 수 있기에, 보통 2차 정규화가 일어나게 됩니다.
✅ 제3정규형
- 제3정규형은 제2정규형을 만족하면서, 모든 일반 속성이 다른 일반 속성에 의존하지 않는 상태입니다.
- 즉, 이행적 종속성을 제거하여, 일반 속성이 다른 일반 속성을 결정하지 않도록 합니다.
✅ 적절한 정규화의 필요성
- 정규화 과정에서 데이터의 효율적인 조회를 위해 주의해야 할 사항이 있습니다.
- 예를 들어, 회원의 배송상태를 조회하는 경우 정규화된 테이블 구조로 인해 여러 번의 JOIN 연산이 필요할 수 있습니다. 이는 시스템의 성능 저하를 일으킬 수 있습니다.
- 따라서, 회원 엔티티와 배송 엔티티 간의 관계를 적절히 설계하여 JOIN 연산을 최소화하고, 성능을 개선할 수 있도록 해야 합니다.
- 쿼리 최적화를 위해, 필요한 경우 반정규화를 고려할 수 있음을 의미합니다.
반정규화란?
- 반정규화는 데이터베이스 성능 최적화를 위해 정규화된 데이터 구조를 일부러 중복, 통합하거나 분할하는 설계 기법입니다.
- 시스템 조회 성능을 향상시키고, 쿼리의 복잡성을 줄이며, 처리 시간을 단축시키기 위해 사용됩니다.
- 그러나 데이터의 정확성과 일관성 유지에 더 많은 주의가 필요합니다.
- 정규화와 같이 반정규화도 일정한 규칙이 존재하고, 반정규화는 정규화가 끝난 후 거치게 됩니다.
- 이제 반정규화의 주요 방법을 살펴보겠습니다.
✅ 테이블 반정규화 방법 3가지!
- 테이블 반정규화에는 테이블 병합, 테이블 분할, 테이블 추가 방법이 존재하며, 데이터 접근 속도를 향상시키기 위해 테이블 구조를 조정하는 과정입니다.
1. 테이블 병합
- JOIN이 많이 필요한 경우, 테이블을 병합하는 것이 성능 측면에서 유리할 때 고려하는 방법입니다.
1:1 관계 테이블 병합: 두 테이블이 1:1 관계에 있을 때, 데이터 접근을 단순화하고 조회 성능을 향상시키기 위해 하나로 합칩니다. 다른 병합보다 비교적 판단하기 쉽고, 부작용도 적다는 장점이 있습니다.
1:M 관계 테이블 병합: 1:M 관계에 있는 테이블을 병합할 때는 1쪽에 해당하는 엔티티의 속성 개수가 많은 경우, 병합하면 중복 데이터가 많아져서 오히려 성능 저하나 저장 공간의 낭비를 초래할 수 있습니다. 따라서 1:M 관계에서 테이블을 병합하기 전에는 1쪽 엔티티의 속성 개수와 중복될 데이터의 양을 면밀히 고려해야 합니다.
슈퍼 / 서브 타입 테이블 병합: 공통 속성을 가진 테이블을 하나로 합쳐 관리의 효율성을 높입니다.
2. 테이블 분할
테이블 수직 분할(속성 분할): 엔티티의 일부 속성을 별도의 엔티티로 분할하면서 1:1 관계를 성립시키는 방법입니다. 특정 속성이 자주 사용하는 속성이 아니거나 대부분의 인스턴스가 해당 속성값을 NULL로 가지고 있을 때 고려하는 방법입니다.
테이블 수평 분할(인스턴스 분할, 파티셔닝): 엔티티의 인스턴스를 특정 기준으로 별도의 엔티티로 물리적 분할하는 파티셔닝 방법입니다.
3. 테이블 추가
중복 테이블 추가: 자주 사용되는 질의를 빠르게 처리하기 위해 중복 데이터를 포함하는 엔티티를 추가합니다.
통계 테이블 추가: 집계나 통계 정보를 빠르게 얻기 위해 별도의 테이블에 저장합니다.
이력 테이블 추가: 데이터 변경 이력을 추적하기 위한 테이블을 추가합니다.
부분 테이블 추가: 특정 조건을 만족하는 데이터만을 포함하는 테이블을 추가하여 조회 성능을 향상시킵니다.
✅ 컬럼 반정규화 방법 3가지!
- 중복 컬럼 추가: 테이블 병합과 같이, JOIN이 많이 필요한 상황에서 컬럼을 추가하는 것이 성능 향상에 도움이 될 때 고려하는 방법입니다!
- 파생 컬럼 추가: 계산에 필요한 결과 값을 미리 계산하여 저장함으로써 조회 성능을 향상시킵니다. 예를 들어 상품의 재고가 이에 해당합니다.
- 이력 테이블 컬럼 추가: 조회 기준이 될 것으로 판단되는 이력 컬럼을 추가하여 데이터 변화 추적을 용이하게 합니다. 예를 들어 최신 데이터 여부가 이에 해당합니다.
✅ 관계 반정규화(중복관계 추가)
- 테이블 병합, 중복 컬럼 추가와 마찬가지로 JOIN이 많이 필요한 상황에서 이번엔 중복 관계를 추가하는 것이 유리할 경우에 고려하는 방법입니다.
트랜잭션이란?
- 트랜잭션은 데이터베이스에서 완벽하게 수행되어야 하는 하나의 작업 단위를 말합니다.
- 예를 들어, 은행 계좌에서 돈을 이체하는 경우, 돈을 출금하는 작업과 입금하는 작업이 모두 성공적으로 이루어져야 합니다. 이 두 작업을 함께 '트랜잭션'이라고 부릅니다.
NULL이란?
- 'NULL'은 데이터베이스에서 '값이 없음'을 나타내는 특별한 마커입니다.
- NULL은 '0'이나 빈 문자열('')과는 다르며, '알 수 없음'이나 '적용할 수 없음'과 같은 의미를 가질 수 있습니다.
- 예를 들어, 어떤 사람의 전화번호 정보가 없는 경우, 해당 필드에는 NULL이 저장될 수 있습니다.
- SQL에서는 가로 연산에 NULL이 포함되어 있으면 결과값은 NULL이 되며, 세로 연산에서는 NULL 값을 제외하고 연산합니다.
728x90
LIST
'자격증 > SQLD' 카테고리의 다른 글
SQL 기본 (1) (0) | 2024.02.19 |
---|---|
데이터 모델과 SQL (2) (0) | 2024.02.15 |
데이터 모델링의 이해 (3) (2) | 2024.02.10 |
데이터 모델링의 이해 (2) (2) | 2024.02.10 |
데이터 모델링의 이해 (1) (5) | 2024.02.09 |