본문 바로가기
DB/이론 및 개념

[DB] DataBase Normalization 데이터베이스 정규화, 복합기본키

by 파프리카_ 2020. 9. 23.
728x90
반응형

정규화란?

: 정규화(Normalization)란 불필요한 데이터의 중복을  제거하여 데이터모델을 구조화하는 것이다.

 

1) 효율적인 자료 저장 및 데이터 무결성을 보장하고,

2) 오류를 최소화하여 안정성을 보장하기 위해,

테이블을 분해하는 과정이다.  

 

* 참고 ) 반정규화 : 시스템 성능 향상, 개발 및 운영 편의성을 위해 정규화된 모델을 통합, 분할하는 과정으로,

의도적으로 정규화 원칙을 위배하는 행위이다. 


[순서]

> 제1 정규화 : 복수의 속성값을 갖는 속성(column)을 분리 = 도메인(=데이터)이 원자값으로!

ex) 상품 주문서에서 주문 상품의 상품명, 상품 상세 내역 등이 복수로 입력되어서는 안 된다. 

       → '주문'과 '주문 상세'로 분리


> 제2 정규화 : 주 식별자에 완전 종속되지 않는 속성을 분리 = 부분함수적 종속을 분리하여 완전 함수적 종속 상태로 만들기

ex) '주문 상세' 테이블에서는 '주문 번호'와 '상품 번호'가 복합 PK이다.

        여기서 '상품명', '상품 상세정보', '단가'와 같은 컬럼(속성)은

        복합 PK에 완전 함수적 종속이 아니라, '상품 번호'에만 부분함수적 종속이므로, 분리해야 한다.

       → 완전 함수적 종속 컬럼(속성)은 '주문 수량' 컬럼이다.

 

> 제3 정규화 : 일반 속성에 종속적인 속성을 분리 = 이행적 함수 종속 성을 분리

ex) A  → B 이면 , B  → C이고, 따라서 A → C 이다.

ex) '주문' 테이블에 '담당부서 번호', '담당 부서명', '담당부서 전화번호', '담당부서 지역'이 있다면, 이행적 함수 종속성이다. 

       PK인 '주문 번호'에 종속되는 것이 아니라, 

       일반 컬럼인 '부서 번호'에 '담당부서 번호', '담당 부서명', '담당부서 전화번호', '담당부서 지역'과 같은 속성은 종속된다.

       → 이를 별도의 부서 테이블로 분리


[ 복합 기본키(PK) ]

: 복합 primary column

: 두 개 이상의 컬럼을 이용하여 primary key를  구성하는 것을 의미한다.

 

예제 

 

1. mvc_shares TABLE 생성

: 복합 기본키 - customer_id, stock_id

create table mvc_shares(
    customer_id VARCHAR2(100),
    stock_id    VARCHAR2(100),
    quantity    NUMBER        NOT NULL,
    CONSTRAINT pk_mvc_shares PRIMARY KEY(customer_id, stock_id)
);

 

2. INSERT

: 복합 PK란 컬럼의 조합 정보가 유일해야 한다. (아니면 error)

-- 복합 pk 테스트
INSERT INTO mvc_shares VALUES('java', '삼성', 10);
INSERT INTO mvc_shares VALUES('angel', '삼성', 20);
INSERT INTO mvc_shares VALUES('angel', 'LG', 30);
INSERT INTO mvc_shares VALUES('java', 'LG', 20);
-- 복합 PK란 컬럼의 조합 정보가 유일해야 한다. : ERROR
INSERT INTO mvc_shares VALUES('angel', '삼성', 10);
INSERT INTO mvc_shares VALUES('java', '삼성', 10);

-- 결과 --

 


예제 

 

> 정규화되지 않은 엔티티

주문내역이 상품번호 개수만큼 반복된다.
어떤 속성이 다수의 반복적인 값을 갖는다면, 1:多 관계의 새로운 엔티티를 추가해야 함


> 제1정규화 : 복수값을 갖는 속성을 분리

주문과 주문상세라는 엔티티로 분리되어 1:多 관계로 설계
But 주문수량은 주문번호와 상품번호의 복합 식별자에 종속적이다.
이에 반해 상품내역은 상품번호에만 종속적임  → 2정규화가 필요


> 제2정규화 : 기본키에 종속되지 않는 속성을 분리

주문수량은 주문번호와 상품번호의 복합 식별자에 종속적이다.
이에 반해 상품내역은 상품번호에만 종속적임으로 2정규화를 적용하여,

1) 상품번호에 종속된 속성만을 모아 하나의 엔티티로 하고

2) 주문번호와 상품번호 모두에 종속되는 속성만을 모아 또 하나의 엔티티로 분리한다.
But 부서명칭이라는 속성은 식별자인 주문번호에 종속되지 않고 일반 속성인 부서번호에 종속적임 3정규화가 필요


> 제3정규화: 일반속성에 종속적인 속성을 분리

부서명칭이라는 속성은 1) 식별자인 주문번호에 종속되지 않고  2) 일반 속성인 부서번호에 종속적이므로 

속성간의 종속성을 가진 속성을 별도에 엔티티로 분리함으로써

모든 엔티티의 속성들이 항상 식별자에 대해서만 종속적인 형태로 설계

 

 

=> SQL문에서 JOIN을 통해 나뉘어진 테이블(엔티티)를 합쳐서 조회할 수 있다 !

728x90
반응형