데이터를 중복 저장하지않기 위해 분리하는 것입니다.
어떻게 하면 효율적으로 분리할 것인가 생각해 봐야합니다.
정규형의 종류에는 여러가지가 있지만, 실무에서는 제 3 정규형까지만 사용한다.
단계적으로 진행되야한다는 특징이 있다.
주문번호 | 날짜 | 이름 | 나이 | 주문 상품 |
---|---|---|---|---|
P001 | 10/23 | 철수 | 13 | A001 레고 1개, A002 미니카 2개 |
P002 | 08/13 | 영희 | 15 | A003 인형 1개, A001 레고 2개 |
P003 | 09/07 | 훈이 | 12 | A003 인형 2개, A002 미니카 1개 |
데이터를 수정하고 삭제할 때 문제가 생길 수 있습니다.
데이터를 찾아갈 때 불필요한 단계를 너무 많이 거치게 됩니다(비효율적)
엑셀 하나의 칸에는 하나의 값만 들어가도록 분리해 줍니다.
비정규화였던 표를 제 1 정규화의 룰대로 바꾸면
주문번호 | 날짜 | 이름 | 나이 | 상품번호 | 상품명 | 상품수량 |
---|---|---|---|---|---|---|
P001 | 10/23 | 철수 | 13 | A001 | 레고 | 1개 |
P001 | 10/23 | 철수 | 13 | A002 | 미니카 | 2개 |
P002 | 08/13 | 영희 | 15 | A003 | 인형 | 1개 |
P002 | 08/13 | 영희 | 15 | A001 | 레고 | 2개 |
P003 | 09/07 | 훈이 | 12 | A003 | 인형 | 2개 |
P003 | 09/07 | 훈이 | 12 | A002 | 미니카 | 1개 |
이런 상황에서는 만약 철수의 이름이 변경되었다고 하면, 2줄 모두 수정해 줘야 합니다.
한 줄 한 줄 모두 수정해야 하는 일이 발생하게 됨으로 비효율적입니다.
아래와 같이 테이블을 두개로 나누면 이를 개선할 수 있습니다.
[ 주문 ] 테이블
주문번호 | 날짜 | 이름 | 나이 |
---|---|---|---|
P001 | 10/23 | 철수 | 13 |
P002 | 08/13 | 영희 | 15 |
P003 | 09/07 | 훈이 | 12 |
[ 주문_상품 ] 테이블
주문번호 | 상품번호 | 상품명 | 상품수량 |
---|---|---|---|
P001 | A001 | 레고 | 1개 |
P001 | A002 | 미니카 | 2개 |
P002 | A003 | 인형 | 1개 |
P002 | A001 | 레고 | 2개 |
P003 | A003 | 인형 | 2개 |
P003 | A002 | 미니카 | 1개 |
Primary Key : 한 줄의 데이터를 구분할 수 있는 유일한 키
Composite Key : 데이터를 대표하는 키가 여러 개의 컬럼으로 구성된 것
주문 테이블은 날짜를 안다고 주문 번호를 알거나 이름을 알 수는 없습니다.
주문_상품 테이블 은 주문번호나 상품번호 한가지만 알아서는 어떤 상품을 주문했는지 알 수 없습니다.
주문번호와 상품번호 둘 다 알아야 합니다. 이를 복합키라고 합니다.
주문_상품 테이블 의 경우처럼 복합키로 구성되어 있을 때, 나머지 칼럼은 이 두 가지 모두에 종속되어야 합니다.
상품명은 복합키 중 일부에만 종속적입니다. 이런 컬럼을 분리시키는 것이 제 2 정규화 입니다.
[ 상품 ] 테이블
상품번호 | 상품명 |
---|---|
A001 | 레고 |
A002 | 미니카 |
A003 | 인형 |
[ 주문 ] 테이블
주문번호 | 날짜 | 고객번호 |
---|---|---|
P001 | 10/23 | U001 |
P002 | 08/13 | U002 |
P003 | 09/07 | U003 |
[ 고객 ] 테이블
고객번호 | 이름 | 나이 |
---|---|---|
U001 | 철수 | 13 |
U002 | 영희 | 15 |
U003 | 훈이 | 12 |
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 카테고리 | 상품태그 | 상품판매자이름 | 상품판매자이메일 | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | 가전 | 전자제품, 영등포마우스 | 철수 | chulsoo@naver.com | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | 가전 | 굿키보드, 전자제품 | 영희 | hee@gmail.com | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | 도서 | 책 | 훈이 | hun@naver.com | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | 도서 | 책사랑 | 맹구 | mang@naver.com | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
위의 표를 제 3 정규화까지 거치면 아래의 표와 같습니다.
[ 상품 ] 테이블
상품ID | 상품명 | 상품내용 | 상품가격 | 상품판매여부 | 상품카테고리ID | 상품판매자ID | 상품거래위치ID |
---|---|---|---|---|---|---|---|
P001 | 마우스 | 좋은 마우스 | 1000 | FALSE | C001 | U001 | L001 |
P002 | 키보드 | 잘쳐지는 키보드 | 1500 | FALSE | C001 | U002 | L002 |
P003 | 데이터베이스 | 데이터베이스책 | 2000 | FALSE | C002 | U003 | L003 |
P004 | 운영체제 | 핵심운영체제 | 3000 | FALSE | C002 | U004 | L004 |
[상품 거래 위치] 테이블
상품거래위치ID | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|
L001 | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
L002 | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
L003 | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
L004 | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
[ 카테고리 ] 테이블
상품카테고리ID | 카테고리 |
---|---|
C001 | 가전 |
C002 | 도서 |
[상품 판매자] 테이블
상품판매자ID | 상품판매자이름 | 상품판매자이메일 |
---|---|---|
U001 | 철수 | chulsoo@naver.com |
U002 | 영희 | hee@gmail.com |
U003 | 훈이 | hun@naver.com |
U004 | 맹구 | mang@naver.com |
[상품 태그] 테이블
상품 태그ID | 상품 태그 |
---|---|
T001 | 전자제품 |
T002 | 영등포마우스 |
T003 | 굿키보드 |
T004 | 책 |
T005 | 책사랑 |
[ 상품_상품태그 ] 테이블
상품ID | 상품 태그ID |
---|---|
P001 | T001 |
P001 | T002 |
P002 | T003 |
P002 | T001 |
P003 | T004 |
P004 | T005 |
[상품 거래 위치] 테이블
상품거래위치ID | 상품거래주소 | 상품거래상세주소 | 상품거래위도 | 상품거래경도 | 상품거래예정시각 |
---|---|---|---|---|---|
L001 | 영등포 | 영등포역 | 10.24 | 30.1 | 10시 |
L002 | 잠실 | 잠실역 | 10.44 | 30.21 | 5시 |
L003 | 신도림 | 신도림역 | 10.33 | 30.66 | 7시 |
L004 | 구로 | 구로역 | 10.37 | 30.99 | 3시 |
[ 카테고리 ] 테이블
상품카테고리ID | 카테고리 |
---|---|
C001 | 가전 |
C002 | 도서 |
[상품 판매자] 테이블
상품판매자ID | 상품판매자이름 | 상품판매자이메일 |
---|---|---|
U001 | 철수 | chulsoo@naver.com |
U002 | 영희 | hee@gmail.com |
U003 | 훈이 | hun@naver.com |
U004 | 맹구 | mang@naver.com |
[상품 태그] 테이블
상품 태그ID | 상품 태그 |
---|---|
T001 | 전자제품 |
T002 | 영등포마우스 |
T003 | 굿키보드 |
T004 | 책 |
T005 | 책사랑 |
[ 상품_상품태그 ] 테이블
상품ID | 상품 태그ID |
---|---|
P001 | T001 |
P001 | T002 |
P002 | T003 |
P002 | T001 |
P003 | T004 |
P004 | T005 |
N : N 관계는 1 : N, N : 1 관계로 풀려야한다.
PK(주키), FK(외례키)
CHAR() - 문자
VARCHAR() - ()자 안에서 유동적으로 바뀜
출처 : 코드캠프