Study/DB

[SQL 첫걸음] 8장.데이터베이스 설계 - 35.정규화

momo02 2018. 9. 30. 18:19
반응형

저자 : 아사이 아츠시

출판 : 한빛미디어 

발매 : 2015.11.01



1. 정규화

- 정규화란 데이터베이스의 테이블을 규정된 올바른 형태 개선해나가는 것. 

- 정규화는 데이터베이스 설계 단계에서 행해짐. 경우에 따라서 기존 시스템을 재검토할 때 정규화하는 경우도 있음.

- 정규화하는 과정을 통해 관계형 데이터베이스가 효율적으로 동작하도록 만들 수 있음. 




2. 제1정규형

- 첫 번째 단계가 제1 정규화로, 이를 시행하면 제1 정규형 테이블을 만들 수 있음. 


  • 제1정규화의 1단계 : 하나의 셀에 하나의 값만 저장할 수 있도록하고, 반복되는 부분을 세로(행 방향으로 늘려나간다.

출처 : SQL 첫걸음


- 주문상품 열에 있는 값들을 상품코드와 상품명, 개수 데이터를 담는 3개의 열로 나눔.

출처 : SQL 첫걸음


- 한번의 주문으로 여러 개의 상품을 주문할 수 있어 주문번호, 날짜, 성명, 연락처가 동일한 값을 가지는 행이 여러개 존재함. 동일한 값을 가지는 행이 여러개 존재하지 않도록 정리. => 주문 테이블을 주문상품테이블과 주문 테이블로 나눔. 주문 상품 테이블에는 주문 테이블과 결합할 수 있도록 주문번호 열을 추가. 

출처 : SQL 첫걸음


- 그 결과 반복되는 부분이 하나로 정리되어, 주문 데이터가 변경되더라도 한 군데만 수정하면 됨.

또한 분할 이후 주문 테이블의 주문번호에는 중복된 값이 존재하지 않아 기본키로 지정 가능. 

한편, 주문상품 테이블에서는 주문 번호와 상품코드를 묶어 기본키로 지정 가능. 

===> 이처럼 제 1정규화에서는 테이블을 분할(반복되는 부분 제거)과 기본키 지정이 이루어짐. 




3. 제2정규형 

- 제2정규화에서는 데이터가 중복하는 부분을 찾아내어 테이블로 분할해 나감. 이때 기본키에 의해 특정되는 열과 그렇지 않은 열로 나누는 것으로 정규화가 이뤄짐. 


- 주문상품테이블의 기본키는 주문번호와 상품코드 두개의 열.  

개수 열은 기본키가 결정되고 나면 특정할 수 있음. ( 주문번호1에 상품코드가 0001인 상품 주문량은 총 1개)  한편, 상품코드는 기본키의 상품코드는 기본키의 일부이긴 하지만 단독으로 기본키 역할을 할 수는 없음. => 이처럼 두 가지로 분류할 수 있으므로 두 개의 테이블로 분할. 

출처 : SQL 첫걸음

- 상품 테이블은 상품코드만으로 기본키를 지정.

===> 부분 함수종속성을 찾아내서 테이블을 분할하는 것이 제2정규화. 함수종속성이란 키 값을 이용해 데이터를 특정지을 수 있는것을 의미




4. 제3정규형 

- 제 3정규화 또한 중복하는 부분을 찾아내 테이블을 분할 하는 수법. 제2정규화의 경우엔 기본키에 중복이 없는지를 조사했지만, 제3정규화에서는 기본키 이외의 부분에서 중복이 없는지를 조사. 


- 분할하기 전의 주문 테이블을 보면 데이터가 중복됨. 같은 사람이 여러 번 주문하는 경우가 있기 때문. 이때 이름을 기준으로 연락처를 특정지을 수 있음. 

단, 주문테이블의 기본키는 주문번호로, 이름은 기본키와 관계없음. 

출처 : SQL 첫걸음


테이블을 분할하여 '고객'테이블을 새로 만듦. 이름을 기본키로 지정하면 동명이인의 경우 데이터를 제대로 저장할 수 없어 고객번호를 기본키로 지정. 


- 실제로는 제 5정규형까지 있지만 대부분의 시스템에서 제 3정규형까지의 정규화를 채택. 

이처럼 정규화를 통해 테이블을 분할해 나가고 분할할 때에는 서로 결합할 수 있도록 기본키를 추가해 분할. 


출처 : SQL 첫걸음




5. 정규화의 목적

- 정규화에서는 중복하거나 반복되는 부분을 찾아내 테이블을 분할하고 기본키를 작성해 사용하는 것을 기본 개념으로 함. 

이는 '하나의 데이터는 한 곳에 있어야 한다'는 규칙에 근거.

- 하나의 데이터가 반드시 한 곳에만 저장되 있다면 데이터를 변경하더라도 한 곳만 변경하면 됨. 반면 정규화되지않은 경우 중복된 데이터를 검색해 일일이 변경해야함. 또한 인덱스가 지정된 열의 데이터가 변경되는 경우 인덱스도 재구축해야 함.

하지만 기본키는 분할한 테이블끼리 연계하기 위해 작성한, 이른바 내부적인 데이터이므로 변경될 일이 거의 없음. 따라서 정규화를 통해 인덱스의 재구축도 억제할 수 있음. 

반응형