C.S/DB

DataBase 정규화

칼쵸쵸 2021. 2. 28. 17:11

데이터베이스 정규화

1. 불필요한 데이터 삭제

2. 삽입, 수정 ,삭제시 이상 현상 방지

 

제 1 정규화

- 한속성이 단하나의 값만 존재

1) 다가 속성

이름 번호 (PK)고객번호
홍길동 1 1
홍길동 2 1

- 고객 번호를 안다고 해도 이름과 번호를 알 수 없다.

- 번호를 PK로 바꾸던가 인조키를 만들어준다.

이름 고객번호(PK)
홍길동 1
번호(PK) 고객번호(FK)
1 1
2 1

 

2) 복합 속성 사용

고객번호(PK) 이름 주민번호
100 홍 길동 990303

- 하나의 컬럼에 여러개의 정보가 들어있음 이름 (성 +이름)

- 컬럼을 분리한다.

- 상황에 따라 사용한다.

고객번호(PK) 이름 주민번호
100 길동 930909

 

3) 유사속성 반복

주문번호1 상품1 주문번호2 상품2
1 의자 2 책상

데이터 증가에 따라서 컬럼이 증가해서는 안된다.

주문번호 별로 상품이름을 매칭한다.

주문번호(PK) 상품이름
1
2 의자

 

제 2 정규화

- 2개 이상으로 구성된 PK에서 발생

- 일반속성 중에서 후보 식별자 전체에 종속적이지 않은 새로운 엔티티 생성

- PK 가 A,B 인 상황에서 B만 알아도 결정됨

주문번호(PK) 상품번호(PK) 상품명 단가 주문수량
100 202 의자 2000 1

상품번호만 알면 상품명과 단가가 결정된다.

상품테이블을 만들고 상품번호를 외래키로 주문테이블에 넣는다.

주문번호(PK) 상품번호(FK) 주문수량
100 202 1
상품번호(PK) 상품명 단가
202 의자 2000

 

제 3 정규화

- 식별자가 아닌 일반 속성 상에서는 종속성이 존재 하지 않는다.

- PK가 아닌값이 일반 컬럼의 값을 결정하는 종속성 존재

- PK가 A,B 인 상황에서 일반 속성 C 가 D 를 결정하는 종속성 존재

 

주문번호(PK) 고객번호 고객명 주문일자
100 302 홍길동 2020.09.09

고객번호가 고객명을 결정하지만 고객번호는 PK가 아님

고객 테이블을 만들고 일반 속성이었던 고객 번호를 기본키로 만든다.

주문번호(PK) 고객번호(FK) 주문일자
100 302 2020.09.09
고객번호(PK) 고객명
302 홍길동

 

BC 정규화

- 종속 식별자가 후보 식별자가 아니어야 한다.

- 일반 속성이 오히려 기본키를 종속한다.

- A,B가 기본키인 상황에서 C가 B를 결정함

학생번호(PK) 교수번호(PK) 과목번호 학점
1 2 2001 A
2 3 3423 B

- 교수는 1개만 강의하는 상황 , 강의는 중복 되지 않는다.

- 강의를 알면 교수를 알 수 있다.

- 과목번호를 FK로 가지는 학생학점 테이블을 만든다.

- 과목 테이블을 만들고 과목번호를 기본키로 교수번호를 정의한다.

학생번호(PK) 과목번호(FK) 학점
1 2001 A
2 3423 B
과목번호(PK) 교수번호
2001 2
3423 3

 

역정규화

- Join시에 발생하는 계산량을 줄여 성능을 높이기 위해 사용

- 정규화된 결과의 일부를 수정하여 중복을 허용

- 정규화되지 않은 상태의 중복과는 다름

- A,B가 기본키이고 C가 B만 알면 결정되어서 2정규화를 위해 (A,C) , (B,A)로 분리하여 2정규화를 진행하였지만 성능을 위해

(A,C) , (B,A,C)로 분리함

- (B,A,C)에서 A는 외래키로 활요

- C가 중복된다.

상품번호(PK) 상품명(PK) 가격
101 의자 3000

 

- 상품명이나 상품번호만 알면 엔티티가 결정된다.

- 상품번호 테이블과 상품명 테이블로 분리 , 상품명을 외래키로 가진다.

상품번호(PK) 가격
101 3000
상품명(PK) 상품번호(FK)
의자 101

 

- 제2 정규화를 진행하였지만 성느을 위해 상품명 테이블에 가격또한 추가해서 이를 통해 조인이 가능도록 한다.

상품명(PK) 상품번호(FK) 가격
의자 101 3000