: 데이터를 중복 저장하지않기 위해 분리하는 것
: 정규화가 된 결과
실무에서는 일부(노란색 상자)만 사용하게 된다..정규형의 종류
비정규화
: 모든 데이터가 하나의 테이블에 다 담겨져있음 => 정규화되지 않은 상태
[ 주문 ]
테이블
주문번호 날짜 이름 나이 주문 상품 P001 10/23 철수 13 A001 레고 1개, A002 미니카 2개 P002 08/13 영희 15 A003 인형 1개, A001 레고 2개 P003 09/07 훈이 12 A003 인형 2개, A002 미니카 1개 위와 같은 주문 테이블이 있을 때, 데이터를 수정하고 삭제할 때 문제가 생길 수 있다.
예를 들어보자면 P001주문에서 주문 상품을 레고 2개로 변경하려면 P001 주문번호를 가지고 있는 주문 상품의 데이터 값에서 '레고'를 찾고, 그 뒤의 숫자 부분을 또 찾아서 1을 2로 수정해주는 번거롭고 불필요한 단계를 너무 많이 거치게 됨으로 비효율적이다.제 1 정규화(1NF)
다가속성(Multivalued Attributed) : 위 테이블처럼 한 줄에 여러 데이터가 있는 것
첫번째로 할 일 => 엑셀 한칸에하나의 값
만 들어가도록 분리해주기
주문번호 날짜 이름 나이 주문 상품 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개 이렇게 만들고보니 주문 상품 컬럼에 속성이 여러개(상품 번호, 상품명, 상품 수량)이 들어있다.
이를복합 속성
이라고 한다.
하나의 칸에는 하나의 값만 들어가게 만드는 것이 제 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개 제 2 정규화(2NF)
Primary key(기본키)와 Composite Key(복합키)
Primary key(기본키)
: 한 줄의 데이터를 구분할 수 있는 유일한 키예시 - 주문번호를 알면 날짜, 이름, 나이를 구분할 수 있음
하지만 날짜를 안다고 주문번호나 이름을 알 수 없다. 그 날짜에 해당하는 주문이 여러개 있을 수 있기 때문이다.
Composite Key(복합키)
: 데이터를 대표하는 키가 여러 개의 컬럼으로 구성된 것예시 -
[주문_상품]
테이블은 주문번호나 상품번호 한가지만 알아서는 어떤 상품을 주문했는지 알 수 없다.
둘 다 알아야 하는데, 이를 복합키라고 한다.
[주문_상품]
테이블처럼 복합키로 구성되어 있다면, 나머지 칼럼은 이 복합키에 모두 종속 되어야 한다.
즉, 상품 수량을 알기 위해서는 주문 번호와 상품 번호를 모두 알아야한다.
하지만 상품명은 상품번호만 알아도 알 수 있게 된다. 이런 경우는 복합키에 모두 종속 된 것이 아닌 일부에만 종속된건데, 이런 컬럼을 분리시키는 것이제 2 정규화
이다.
[상품]
테이블
상품번호 상품명 A001 레고 A002 미니카 A003 인형
[ 주문_상품 ]
테이블
주문번호 상품번호 상품수량 P001 A001 1개 P001 A002 2개 P002 A003 1개 P002 A001 2개 P003 A003 2개 P003 A002 1개 이렇게
[상품]
테이블로 분리를 해놓으면 '레고' 상품명이 변경된다고 할지라도 1개의 컬럼만 바꿔주면 된다.제 3 정규화(3NF)
: A -> B -> C의 관계를 가지고 있을 때, A와 B, B와 C를 묶어 다른 테이블로 분리하는 것
[주문]
테이블
주문번호 날짜 고객번호 P001 10/23 U001 P002 08/13 U002 P003 09/07 U003
[고객]
테이블
고객번호 이름 나이 U001 철수 13 U002 영희 15 U003 훈이 12 실습해보기
상품 데이터 정규화 - 엑셀
: 테이블 간의 관계를 보여주는 그림
위에 엑셀로 상품 데이터 정규화를 ERD로 표현함
PK와 FK
PK(Primary Key) : 기본키이며, 그 테이블에서 데이터들을 구분할 수 있는 유니크한 값
FK(Foreign Key) : 외래키(참조키)이며, 다른 테이블에서 값을 참조할 때 참조해오는 테이블의 PK(기본키)를 말한다.ERD의 관계도
다른 테이블과 연결시킨다고 할 때, 두 테이블이
1:1 관계
,1:N 관계
,N:M 관계
인지 설정 해줘야한다.1 : 1 관계
중고 상품 거래를 예시로 만든 ERD이기 때문에, 중고 상품 1개가 가질 수 있는 상품거래주소는 한개이다.
1 : N 관계
상품 카테고리 하나에는 여러 상품이 들어있을 수 있다.
예시를 들어보면 apple이라는 카테고리가 있으면 그 안에서 아이패드라는 상품을 팔 수도 있고, 아이폰이라는 상품을 팔 수 있을 것이다.
하지만 상품은 하나의 카테고리만 가질 수 있게 설정을 해놓았기때문에,1:N 관계
이다.유저와 상품 테이블도 마찬가지이다.
한 유저는 여러 상품 판매글을 올릴 수 있으나, 상품 하나는 한명의 유저만 가질 수 있다.N : M 관계
상품 하나는 여러개의 태그를 가질 수 있고, 태그도 하나의 태그가 여러 상품에 사용될 수 있다.
이런 경우에는 상품_상품태그 테이블처럼 중간 테이블을 만들어 사이에 두고 각각 1:n의 관계를 갖도록 그려준다.