백엔드 복습-Day14

이예음·2022년 12월 14일
0

백엔드 복습하기

목록 보기
13/23
post-thumbnail

데이터 정규화

: 데이터를 중복 저장하지않기 위해 분리하는 것

데이터 정규형(Normal Form)

: 정규화가 된 결과
실무에서는 일부(노란색 상자)만 사용하게 된다..

정규형의 종류

비정규화

: 모든 데이터가 하나의 테이블에 다 담겨져있음 => 정규화되지 않은 상태

[ 주문 ] 테이블

주문번호날짜이름나이주문 상품
P00110/23철수13A001 레고 1개, A002 미니카 2개
P00208/13영희15A003 인형 1개, A001 레고 2개
P00309/07훈이12A003 인형 2개, A002 미니카 1개

위와 같은 주문 테이블이 있을 때, 데이터를 수정하고 삭제할 때 문제가 생길 수 있다.
예를 들어보자면 P001주문에서 주문 상품을 레고 2개로 변경하려면 P001 주문번호를 가지고 있는 주문 상품의 데이터 값에서 '레고'를 찾고, 그 뒤의 숫자 부분을 또 찾아서 1을 2로 수정해주는 번거롭고 불필요한 단계를 너무 많이 거치게 됨으로 비효율적이다.

제 1 정규화(1NF)

다가속성(Multivalued Attributed) : 위 테이블처럼 한 줄에 여러 데이터가 있는 것
첫번째로 할 일 => 엑셀 한칸에 하나의 값만 들어가도록 분리해주기

주문번호날짜이름나이주문 상품
P00110/23철수13A001 레고 1개
P00110/23철수13A002 미니카 2개
P00208/13영희15A003 인형 1개
P00208/13영희15A001 레고 2개
P00309/07훈이12A003 인형 2개
P00309/07훈이12A002 미니카 1개

이렇게 만들고보니 주문 상품 컬럼에 속성이 여러개(상품 번호, 상품명, 상품 수량)이 들어있다.
이를 복합 속성이라고 한다.
하나의 칸에는 하나의 값만 들어가게 만드는 것이 제 1 정규화이기 때문에,
주문 상품을 또 분리해야한다.

주문번호날짜이름나이상품번호상품명상품수량
P00110/23철수13A001레고1개
P00110/23철수13A002미니카2개
P00208/13영희15A003인형1개
P00208/13영희15A001레고2개
P00309/07훈이12A003인형2개
P00309/07훈이12A002미니카1개

이렇게 만들고나면 주문번호부터 나이까지 중복된 데이터들이 있음
그렇게 되면 나오는 문제점으로는 '철수'라는 이름을 수정하고 싶다면, 모든 줄의 데이터를 수정해줘야한다.
이 문제점은 아래와 같이 테이블을 2개로 분리해주면 된다.

[ 주문 ] 테이블

주문번호날짜이름나이
P00110/23철수13
P00208/13영희15
P00309/07훈이12

[ 주문_상품 ] 테이블

주문번호상품번호상품명상품수량
P001A001레고1개
P001A002미니카2개
P002A003인형1개
P002A001레고2개
P003A003인형2개
P003A002미니카1개

제 2 정규화(2NF)

Primary key(기본키)Composite Key(복합키)
Primary key(기본키) : 한 줄의 데이터를 구분할 수 있는 유일한 키

예시 - 주문번호를 알면 날짜, 이름, 나이를 구분할 수 있음
하지만 날짜를 안다고 주문번호나 이름을 알 수 없다. 그 날짜에 해당하는 주문이 여러개 있을 수 있기 때문이다.


Composite Key(복합키) : 데이터를 대표하는 키가 여러 개의 컬럼으로 구성된 것

예시 - [주문_상품] 테이블은 주문번호나 상품번호 한가지만 알아서는 어떤 상품을 주문했는지 알 수 없다.
둘 다 알아야 하는데, 이를 복합키라고 한다.

[주문_상품] 테이블처럼 복합키로 구성되어 있다면, 나머지 칼럼은 이 복합키에 모두 종속 되어야 한다.
즉, 상품 수량을 알기 위해서는 주문 번호와 상품 번호를 모두 알아야한다.
하지만 상품명은 상품번호만 알아도 알 수 있게 된다. 이런 경우는 복합키에 모두 종속 된 것이 아닌 일부에만 종속된건데, 이런 컬럼을 분리시키는 것이 제 2 정규화이다.

[상품] 테이블

상품번호상품명
A001레고
A002미니카
A003인형

[ 주문_상품 ] 테이블

주문번호상품번호상품수량
P001A0011개
P001A0022개
P002A0031개
P002A0012개
P003A0032개
P003A0021개

이렇게 [상품] 테이블로 분리를 해놓으면 '레고' 상품명이 변경된다고 할지라도 1개의 컬럼만 바꿔주면 된다.

제 3 정규화(3NF)

: A -> B -> C의 관계를 가지고 있을 때, A와 B, B와 C를 묶어 다른 테이블로 분리하는 것

[주문] 테이블

주문번호날짜고객번호
P00110/23U001
P00208/13U002
P00309/07U003

[고객] 테이블

고객번호이름나이
U001철수13
U002영희15
U003훈이12

실습해보기

상품 데이터 정규화 - 엑셀

[상품 데이터 정규화 - 엑셀]

ERD(Entity-Relationship Diagram)

: 테이블 간의 관계를 보여주는 그림

위에 엑셀로 상품 데이터 정규화를 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의 관계를 갖도록 그려준다.

profile
응애

0개의 댓글