정규화 ( Nomalization )
정규화는 데이터의 일관성과 중복을 최소화하고 유연성을 최대화 하는 방법이며 데이터를 분해하는 과정이다.
정규화를 하지 않으면 불필요한 정보가 같이 추가되는 이상현상이 발생한다.
정규화를 수행하면 불필요한 데이터를 입력하지 않아도 되기 때문에 중복 데이터가 제거된다.
정규화 절차
제 1 정규화 | 속성의 원자성을 확보한다. 기본키(Primary)를 설정한다. 기본키가 1개가 될 수 있고 2개가 될 수 있다. ( 기본키는 유일성이 만족되어야한다.) |
제2 정규화 | 기본키가 2개 이상의 속성으로 이루어진 경우, 부분 함수 종속성을 제거(분해)한다. 기본키로 설정한 칼럼이 함수적으로 종속(부분 함수 종속성이 발생)하고 있다면 분해해야한다. |
제3 정규화 | 기본키를 제외한 칼럼 간에 종속성을 제거한다. 즉, 이행 함수 종속성을 제거한다. |
BCNF | 기본키를 제외하고 후보키가 있는 경우, 후보키가 기본키를 종속시키면 분해한다. |
제2정규화
함수적 종속성이란?
X가 변화하면 Y도 변화하는지 확인하는 것이다.
ex) 회원ID가 바뀌면 이름이 바뀌는 것 ( 회원ID가 이름을 함수적으로 종속한다.) = 완전 함수 종속성
부분 함수 종속성이란?
회원ID가 기본키인데 회원ID가 변경되면 이름도 변경된다.
이러한 경우를 부분 함수 종속성이라고 한다.
회원이라는 새로운 테이블을 만들고 회원ID가 기본키가 되어 이름을 종속해야한다.
제3정규화
이행 함수 종속성이란?
기본키를 제외하고 칼럼간에 종속성이 발생하는 것이다.
관리점 코드와 관리점이 이행 함수 종속성이다.
이러한 경우도 관리점이라는 새로운 테이블을 만들고 관리점 코드가 관리점을 종속해야한다.
BCNF
BCNF는 복수의 후보키가 있고, 후보키들이 복합 속성이어햐 하며, 서로 중첩되어야 한다.
이럴 경우에도 테이블을 새롭게 만들어 분해 해야한다.
정규화의 문제점
정규화는 데이터 테이블 분해하는 작업이다. 그래서 분해된 데이터 테이블을 조회(SELECT)시에 조인(Join)을 많이 사용하기 떄문에 CPU와 메모리를 많이 사용한다.
조인을 사용하는 것은 중첩된 루프를 사용해야 하는 것이기 때문에 성능저하를 일으킬 수 있다.
이러한 문제를 해결하기 위해서 인덱스와 옵티마이저(Optimizer)가 있는 것이다.
반정규화
정규화의 문제점을 해결하고 성능 향상을 위하여, 데이터 중복을 허용하고 조인을 줄인다.
속도는 향상하지만 , 데이터 모델의 유연성은 낮아진다.
반정규화를 수행하는 경우
-
정규화에 충실하면 종속성, 활용성은 향상되지만 수행 속도가 느려지는 경우
-
다량의 범위를 자주 처리해야 하는 경우
-
특정 범위의 데이터만 자주 처리하는 경우
-
요약/집계 정보가 자주 요구되는 경우
반정규화 기법
[1] 계산된 칼럼 추가
- 총판매액, 평균잔고 등을 미리 계산하고 그 결과를 특정 칼럼에 추가
[2] 테이블 수직 분할
- 칼럼을 분할하여 새로운 테이블을 만드는 것
[3] 테이블 수평분할
- 하나의 테이블에 있는 값을 기준으로 테이블을 분할하는 방법
ex) 연도 별로 분할
[4] 테이블 병합
- 1대1 관계의 테이블을 하나의 테이블로 병합해서 성능을 향상시킨다.
- 1대N 은 성능이 향상되지만 많은 양의 중복이 발생한다.
- 슈퍼타입과 서브타입 관계가 발생하면 테이블을 통합하여 성능을 향상시킨다.
슈퍼 타입 및 서브 타입 변환 방법
OneToOne Type | 개별 테이블로 도출 |
Plus Type | 테이블로 도출 |
Single Type | 하나의 테이블로 도출 ( 조인 성능이 좋고 관리가 편하다. ) |
파티션 기법
파티션을 사용하여 테이블을 분할 할 수 있다.
논리적으로 하나의 테이블이지만 여러 개의 데이터 파일에 분산되어서 저장된다.
-
Range Partition : 데이터 값의 범위를 기준으로 파티션
-
List Partition : 특정한 값을 지정하여 파티션을 수행
-
Hash Partition : 해시 함수를 적용하여 파티션을 수행
-
Composite Partition : 범위와 해시를 복합적으로 사용하여 파티션 수행 ( Range + Hash )
분산 데이터베이스
중앙 집중형 데이터베이스
한 대의 물리적 시스템에 데이터베이스 관리 시스템을 설치하고
여러 명의 사용자가 데이터베이스 관리 시스템에 접속하여 사용하는 구조
분산 데이터베이스
물리적으로 떨어진 데이터베이스에 네트워크로 연결하여 분산 처리 작업을 수행하는 데이터베이스
고객은 시스템이 네트워크로 분산되어 있는지의 여부를 인식하지 못하면서,
자신만의 데이터베이스를 사용하는 것처럼 사용할 수 있다. 이 처럼 투명성을 제공해야한다.
( 여기서 투명하다는 것은 숨기는 것이 없다는 게 아니라 오히려 반대로 가린다는 의미이다. 고객은 몰라도 된다.)
분할 투명성 | 고객은 하나의 논리적 릴레이션이 여러 단편으로 분할되어 각 단편의 사본이 여러 시스템에 저장되어 있음을 인식할 필요가 없다. |
위치 투명성 | 고객이 사용하려는 데이터의 저장 장소를 명시할 필요가 없다. 어느 위치에 있더라도 동일한 명령을 사용하여 데이터에 접근할 수 있어야 한다. |
지역 사상 투명성 | 지역 DBMS와 물적 데이터베이스 사이의 사상이 보장됨에 따라 각 지역 시스템 이름과 무관한 이름이 사용 가능하다. |
중복 투명성 | 데이터베이스 객체가 여러 시스템에 중복되어 존재함에도 고객과는 무관하게 데이터의 일관성이 유지된다. |
장애 투명성 | 데이터베이스가 분산되어 있는 각 지역의 시스템이나 통신망에 이상이 발생해도, 데이터의 무결성은 보장된다. |
병행 투명성 | 여러 고객의 응용 프로그램이 동시에 분산 데이터베이스에 대한 트랜잭션을 수행하는 경우에도 결과에 이상이 없다. |
하향식 접근 : 전역스키마를 생성하고 지역 스키마를 생성
상향식 접근 : 지역스키마를 생성하고 전역스키마로 통합
분산 데이터베이스 장점과 단점
장점 | 단점 |
데이터베이스 신뢰성과 가용성이 높다. 분산 데이터베이스가 병렬 처리를 하기 때문에 빠른 응답이 가능하다. 분산 데이터베이스를 추가하여 시스템 용량 확장이 쉽다. |
데이터베이스가 네트워크를 통해서 분리되어 관리와 통제가 어렵다. 보안관리가 어렵다. 데이터 무결성 관리가 어렵다. 데이터베이스 설계가 복잡하다. |
'RDBMS > SQL' 카테고리의 다른 글
[SQL] Python 에서 SQL을 다루는 방법. (0) | 2021.01.04 |
---|---|
[SQLD] .SQL 최적화 원리 (Optimizer) (0) | 2020.09.01 |
[SQLD]. SQL 기본 (0) | 2020.08.26 |
[SQLD] 데이터 모델링의 이해(1) (0) | 2020.08.13 |
[SQL] 기본 쿼리문 ( SELECT , WHERE , INSERT , UPDATE , DELETE ,ORDER BY) (0) | 2020.04.28 |