-
- 제1정규화
- 종속자는 함수 종속성을 갖게 되며 결정자에 의해 종속자가 결정되는 구조입니다.이름, 출생지, 주소는 주민등록번호에 대해 함수 종속성을 갖습니다. 여기서 이름, 출생지, 주소는 주민등록번호가 결정하기 때문에 '종속자'라고 볼 수 있고 주민등록번호는 이들을 결정하기 때문에 '결정자'라고 볼 수 있습니다.
- 회원정보아이디 나이 성별 회원구분 연락처
justin 33 남 일반 010-1234-1234, justin@email.kr ed 45 남 일반 010-2456-1234, ed@email.kr chelsea 27 여 프리미엄 010-1256-7895, chelsea@email.kr
- 회원 정보아이디 나이 성별 회원구분
justin 33 남 일반 ed 45 남 일반 chelsea 27 여 프리미엄 - 회원 연락처아이디 연락처 구분 연락처
justin 핸드폰 010-1234-1234 justin 이메일 justin@email.kr ed 핸드폰 010-2456-1234 ed 이메일 ed@email.kr chelsea 핸드폰 010-1256-7895 chelsea 이메일 chelsea@email.kr
-
- 제1정규화
- 회원정보아이디 나이 성별 회원구분 연락처
justin 33 남 일반 010-1234-1234, justin@email.kr ed 45 남 일반 010-2456-1234, ed@email.kr chelsea 27 여 프리미엄 010-1256-7895, chelsea@email.kr
- 회원 정보아이디 나이 성별 회원구분
justin 33 남 일반 ed 45 남 일반 chelsea 27 여 프리미엄 - 회원 연락처아이디 연락처 구분 연락처
justin 핸드폰 010-1234-1234 justin 이메일 justin@email.kr ed 핸드폰 010-2456-1234 ed 이메일 ed@email.kr chelsea 핸드폰 010-1256-7895 chelsea 이메일 chelsea@email.kr
- 회원정보아이디 나이 성별 회원구분 연락처
2) 제2정규화
제 1정규화를 만족시키고 PK가 아닌 모든 칼럼은 PK 전체에 종속
만약 PK에 종속되지 않거나 PK 중에서 일부의 칼럼에만 종속되는 칼럼이 있다면 이는 분리시켜야 합니다.
PK 값은 해당 테이블의 어떤 속성과도 종속관계를 갖는다는 사실을 알고 있습니다. 아래 고객 주문 테이블에서 PK는 고객 아이디와 주문 순번의 복합 속성으로 구성되어 있습니다. 복합 식별자(PK)를 기준으로 놓고 볼 때 '고객 이름'과 '고객 등급' 속성은 '고객 아이디' 속성에는 종속되지만 '주문 아이템'이라는 속성에는 종속되지 않습니다. 고객 이름과 고객 등급의 값을 결정하는 기본키를 구성하는 칼럼은 고객 아이디 하나이고 '주문 순번'은 이에 영향을 주지 않습니다.
이러한 경우의 문제점은 특정한 데이터를 갱신하려고 할 때 갱신 이상(Modification Anomaly) 현상이 발생할 가능성이 큽니다. 또한 고객 정보를 모르면 주문 할 수 없는 경우가 생길 수 있습니다.
참고 - 갱신 이상(Modification Anomaly) 반복되는 데이터 중에서 일부를 갱신할 때 데이터가 일치하지 않는 문제를 의미합니다. 특정한 값을 갖는 행을 수정 할 경우에 해당 값을 공유하는 모든 행을 변경해 주지 않으면 업데이트 된 내용이 일치하지 않게 됩니다. 이런 경우를 갱신 이상이 발생했다고 표현합니다.
테이블을 분리하여 고객 정보를 위한 식별자를 추가하여 문제를 해결할 수 있습니다. 테이블을 2개로 분리하고 고객 정보는 고객 아이디 식별자에 종속될 수 있도록 구성하여 복합 식별자의 일부 칼럼에만 종속되는 문제를 해결 했음을 확인할 수 있습니다. 이렇게 제 2정규화 작업을 수행할 수 있습니다.
제1정규화
|
- 모든 속성은 반드시 하나의 값을 가져야 합니다. - 한 속성에 여러 속성값을 부여하거나 같은 유형의 속성이 여러 개인 경우 해당 속성을 분리합니다. (속성의 원자성 확보)
|
제2정규화
|
주식별자에 완전하게 함수 종속되지 않은 속성을 분리하여 종속 관계를 구성합니다. (부분종속 속성을 분리)
|
제3정규화
|
일반 속성간의 함수 종속성이 발생하지 않도록 분리합니다. (이전종속 속성을 분리)
|
보이스 - 코드 정규화 (BCNF)
|
결정자 안에 함수 종속을 가진 주식별자 속성을 분리합니다.
|
제4정규화
|
다치 종속성(Multi-Valued Dependency)을 제거합니다.
|
제5정규화
|
조인 속성(Join Dependency)을 제거합니다.
|
반정규화
반정규화 (혹은 역정규화)에서 '반'이 갖는 의미는 '절반'이 아닌 '반대'입니다. 정규화를 수행하지 않은 모델을 지칭할 때 사용합니다. 반정규화는 성능 향상에 그 목적이 있습니다. 정규화는 성능 향상을 목적으로 중복된 데이터를 지우는 과정이었습니다. 반정규화는 정규화와 동일하게 '성능 향상'이라는 목적을 갖지만 데이터의 중복을 통해 목적을 달성한다는 측면에서 다른 의미를 지닙니다.
데이터의 정확성과 일관성을 의미하는 '데이터 무결성'의 측면에서 바라보면 반정규화는 있어서는 안 될 일이지만 그럼에도 데이터를 중복하여 반정규화를 적용하는 상황을 아래와 같이 정리해 볼 수 있습니다.
- 데이터를 조회할 때 디스크 I/O량이 많아서 성능이 저하되는 경우입니다.
- 테이블 간 경로가 너무 멀어 조인으로 인한 성능 저하가 예상되는 경우입니다.
- 칼럼을 계산하여 읽을 때 성능이 저하될 것이라고 예상하는 경우입니다.
반정규화 기법
1) 테이블 반정규화 2) 칼럼의 반정규화 3) 관계에서의 반정규화
1. 테이블 반정규화
테이블 반정규화는 테이블 병합, 테이블 분할, 테이블 추가 이렇게 3가지로 나눠집니다.
1) 테이블 병합 : 여러개의 테이블을 하나로 합치는 과정, 테이블을 병합하면 데이터를 중복 저장하게 되지만 조회 과정의 성능 향상을 위해서 수행
2) 테이블 분할 : 특정 테이블을 여러 개의 테이블로 나누는 것을 의미
3) 테이블 추가 : 특정 테이블을 추가하는 것을 의미, 데이터의 중복 저장의 비효율이 발생하더라도 조회의 성능을 높이기 위해 사용
2. 칼럼 반정규화
참고 - 복합키(Composite Key) 기본키로 사용할 수 있는 칼럼이 없을 때 2개 이상의 키를 합쳐 하나의 기본키로 활용하는 것을 의미합니다. 데이터를 대표하는 키가 여러 개의 칼럼으로 구성된 것을 의미합니다. 복합키를 사용하는 경우 SELECT 문을 사용하여 WHERE을 통해 조건을 건 조회를 할 때 어떻게 조회하는지에 따라서 쿼리 성능이 많이 달라집니다.
칼럼의 반정규화는 특정 칼럼을 추가하여 데이터 모델 내에서 중복으로 데이터가 저장됨에도 성능을 향상시킬 수 있는 방법입니다.
중복 칼럼을 추가하여 조인 연산을 제거, 추가 칼럼을 만들어 계산된 값을 미리 만들어 놓고 보여주는 형태로 연산 감소, 이력 테이블에 특정 칼럼을 추가해서 조회 성능 향상, PK 칼럼 내에 특정한 규칙에 의해 데이터가 저장되어 있지만 일반 칼럼으로 만드는 방법, 응용 시스템의 오작동을 위해 칼럼을 추가시키는 방법이 있습니다.
3. 관계 반정규화
여러 경로에 걸쳐 테이블 조인을 하는 경우 조인 연산 자체를 줄여서 조회 성능을 향상시키는 방법입니다. 만약 A → B → C 형태로 테이블 조인이 발생한다면 A → C로 줄이는 것이 관계 반정규화의 목적입니다. 관계 반정규화는 데이터 무결성을 위반하더라도 데이터 처리를 할 때 성능을 향상시키기 위해 사용하는 반정규화 기법입니다.
'DB' 카테고리의 다른 글
UML (Unified Modeling Language) (0) | 2024.02.25 |
---|---|
컬럼의 Key속성 - FK와 MUL (0) | 2023.11.16 |
[Redis] 1. AWS elasticache (0) | 2023.07.15 |
29. DB 파티셔닝, 샤딩, 레플리케이션 (0) | 2023.07.09 |
25. DB 인덱스 (0) | 2023.07.06 |