반응형
정규화란 DB의 테이블을 규정된 올바른 형태로 개선해 나가는 것이다.
- DB의 설계 단계에서 행해진다.
- 기존 시스템을 재검토할 때 정규화하는 경우도 있다.
정규화 (쇼핑물 사이트의 주문처리 시스템)
- 상품은 상품코드를 이용해 다루어 보자
주문번호 | 날짜 | 성명 | 연락처 | 주문상품 |
1 | 1/1 | 박준용 | 010-xxxx | 0001 OO 1개, 0002 XX 10개 |
2 | 2/1 | 김재진 | 010-xxxx | 0001 OO 2개, 0002 XX 3개 |
3 | 2/5 | 박준용 | 010-xxxx | 0001 OO 3개, 0003 AA 1개 |
- ‘0001 OO 1개’은 상품코드가 0001인 상품 OO를 1개 주문 했다는 뜻이다.
- 대충 만들어진 데이터를 정규화해 DB테이블로 만들어보자
정규화의 순서는 이전의 DB 기술자들이 고안해 정리한 것이다.
- 정규화 하는 과정을 통해 관계형 DB가 효율적으로 동작하도록 만들 수 있다.
- 정규화는 단계적으로 실시한다.
제1 정규형
관계형 DB의 테이블에는 하나의 셀에 하나의 값만 저장할 수 있다는 제약이 있다.
- 주문상품의 데이터를 그대로 테이블로 만들 수 없다.
- 적어도 상품코드, 상품명, 개수 데이터를 담는 세 개의 열로 나누어야 한다.
주문번호 | 날짜 | 성명 | 연락처 | 상품코드 | 상품명 | 개수 |
1 | 1/1 | 박준용 | 010-xxxx | 0001 | OO | 1 |
1 | 1/1 | 박준용 | 010-xxxx | 0002 | XX | 10 |
2 | 2/1 | 김재진 | 010-xxxx | 0001 | OO | 2 |
2 | 2/1 | 김재진 | 010-xxxx | 0002 | XX | 3 |
3 | 2/5 | 박준용 | 010-xxxx | 0001 | OO | 3 |
4 | 2/5 | 박준용 | 010-xxxx | 0003 | AA | 1 |
- 이 때 테이블 이름은 ‘주문’테이블 이라고 하겠다.
- 하나의 셀에는 하나의 값만 저장되므로 테이블화 할 수 있다.
주문상품 데이터를 상품코드와 개수로 분활했기 때문에 열이 2개 더 추가되었으며 행도 늘어났다.
하나의 셀에 하나의 값만 저장할 수 있도록 하고, 반복되는 부분을 세로(행) 방향으로 늘려나가는
것이 제1정규화의 제1단계이다.
- 반복되는 데이터를 가로(열 방향)가 아닌 세로(행 방향)로 늘리는 것이 제1정규화의 제1단계이다.
제1정규화에서는 중복을 제거하는 테이블의 분할도 이루어진다.
- 한번의 주문으로 여러개의 상품을 주문할 수 있으므로 주문번호, 날짜, 성명, 연락처가 동일한 값을 가지는 행이 여러개 존재할 수 있다.
- 동일한 값을 가지는 행이 여러개 존재하지 않도록 하나로 정리해야 한다.
주문 테이블을 주문상품 테이블과 주문 테이블로 나눈다.
- 주문상품 테이블은 상품코드, 상품명, 개수로 구성하되, 추가적으로 주문 테이블과 결합할 수 있도록 주문번호 열을 추가한다.
- 반복되는 부분이 하나로 정리되었다.
- 주문데이터가 변경되더라도 한 군데만 수정하면 된다.
- 분할 전 상태의 데이터를 원할 때에도 결합하면 되므로 문제가 없다.
주문 테이블을 보면 주문번호에는 중복된 값이 준재하지지 않기 때문에 기본키로 지정할 수 있다.
- 주문상품 테이블에서는 주문 번호와 상품코드를 기본키 묶어 지정할 수 있다.
제1정규화에서는 반복되는 부분을 찾아내서 테이블을 분할하고 기본키가 된 열을 작성할 수 있다.
- 제1정규화에서는 테이블 분할과 기본키 지정이 이루어진다!
제2정규형
데이터가 중복하는 부분을 찾아내어 테이블로 분할해 나간다.
- 기본키에 의해 특정되는 열과 그렇지 않은 열로 나누는 것으로 정규화가 이루어진다.
<주문상품 테이블>
주문번호 | 상품코드 | 상품명 | 개수 |
1 | 0001 | OO | 1 |
1 | 0002 | XX | 10 |
2 | 0001 | OO | 2 |
2 | 0002 | XX | 3 |
3 | 0001 | OO | 3 |
3 | 0003 | AA | 1 |
주문상품의 기본키는 주문번호와 상품코드의 두 개 열로 되어있다.
- 주문번호1에 상품코드가 0001인 상품 주문량은 총 1개라는 것을 알 수 있다.
- 기본키를 바탕으로 특정되는 데이터이다.
- 개수 열은 기본키가 결정되고 나면 특정할 수 있다는 것이다.
- 상품명은 주문번호와 관계없이 상품코드만으로 특정할 수 있다.
- 상품코드는 기본키의 일부이긴 하지만 단독으로 기본키 역활을 할 수는 없다.
이처럼 두가지로 분류할 수 있으므로 두 개의 테이블로 분할하자 (’상품’ 테이블)
상품 테이블은 상품코드만으로 기본키를 지정했다.
- 부분 함수종속성을 찾아내서 테이블을 분할하는 것이 제2정규화이다.
- 함수종속성이란 키 값을 이용해 데이터를 특정지을 수 있는 것을 가리킨다.
제3정규형
중복하는 부분을 찾아내어 테이블을 분할하는 수법이다.
- 제3정규형에서는 기본키 이외의 부분에서 중복이 없는지를 조사한다.
주문번호 | 날짜 | 성명 | 연락처 |
1 | 1/1 | 박준용 | 010-xxxx |
2 | 2/1 | 김재진 | 010-xxxx |
3 | 2/5 | 박준용 | 010-xxxx |
주문테이블을 보면 같은 사람이 여러번 주문하는 경우가 있기 때문에 데이터가 중복되어 있다.
- 주문 테이블에서 이름을 기준으로 연락처를 특정지을 수 있다.
- 주문 테이블의 기본키는 주문번호로, 이름은 기본키와는 관계가 없다.
- 고객 테이블도 이름을 기본키로 지정하면 동명이인의 경우 데이터를 제대로 저장할 수 없다.
- 고객번호를 기본키로 지정해야 한다.
실제로는 제5정규화형까지 있지만 대부분의 시스템에서 제3정규형까지의 정규화를 채택한다.
분할할 때에는 서로 결합할 수 있도록 기본키를 추가해 분할한다.
- 테이블 간의 연계는 ER다이어그램으로 표현하면 알기 쉽다.
정규화의 목적
정규화에서는 중복하거나 반복되는 부분을 찾아내서 테이블을 분할하고 기본키를 작성해 사용하는 것을 기본 개념으로 삼는다.
#‘하나의 데이터는 한 곳에 있어야 한다’는 규칙에 근거한다.
정규화로 데이터 구조를 개선하는 것은 하나의 데이터가 한곳에 저장되도록 하기 위함이다.
하나의 데이터가 반드시 한 곳에만 저장되어 있다면 데이터를 변경하더라도 한 곳만 변경하는 것으로 끝낼 수 있다.
- 정규화되지 않은 경우에는 여기저기 중복해서 저장된 데이터를 검색하고 일일이 변경해야 한다.
- 인덱스가 지정된 열의 데이터가 변경되는 경우에는 인덱스도 재구축해야 한다.
기본키는 분할한 테이블끼리 연계하기 위한 내부적인 데이터이므로 변경될 일은 거의 없다.
- 정규화를 통해 테이블에 대한 인덱스의 재구축을 억제할 수 있다.
반응형
'책 > SQL 첫걸음' 카테고리의 다른 글
트랜잭션 (0) | 2023.03.12 |
---|---|
복수의 테이블 다루기 (join) (0) | 2023.03.12 |
복수의 테이블 다루기 (집합) (0) | 2023.03.12 |
인덱스(index) (2) | 2023.03.12 |
뷰(view) (0) | 2023.02.24 |