(지금부터 드는 정규화 표의 예시는 생활코딩 영상 강의를 보며 표의 내용만 살짝 변경한 점을 미리 알려둔다.)
제1 정규화란, Atomic columns라는 조건에 만족하게끔 비정규형 테이블을 제1 정규형 테이블로 구조화하는 것을 말한다.
위의 비정규형 테이블을 보면, 태그라는 칼럼에 값이 두 개씩 들어있다는 것을 확인할 수 있다. 필요에 따라 하나의 레코드에 여러 값이 들어 있는 경우가 있을 수는 있다. 그러나 패션
, 의류
또는 잡화
라는 태그로 데이터를 조회하고자 할 때는 하나의 레코드에 여러 태그가 있기 때문에 원하는 데이터를 찾지 못할 것이다.
때문에 현재 테이블에는 해소되어야 할 문제가 있다. 태그와 상품의 관계를 생각해보면,
라는 문장에서 정답은 모두 복수 개의
일 것이다. 따라서 상품과 상품태그는 N:M
즉 다대다의 관계를 가진다. 다대다의 관계를 가지는 칼럼은 이들의 관계를 표현한 새로운 테이블을 통해 연결될 수 있다.
따라서 tag
라는 테이블을 만들어 각 태그에 id
를 주고, 이것을 fashion_tag_relation
이라는 관계 테이블에서 fashion_상품
의 값들과 연결시켜줌으로써 표를 정규화할 수 있다.
제2 정규화란, No partial dependencies라는 조건에 만족하게끔 제1 정규형 테이블을 제2 정규형 테이블로 정규화하는 것을 말한다.
No partial dependencies는 부분 종속성이 없어야 한다는 말이다. 이것은 다시 말해 표에 중복키인 기본키가 없어야 한다는 의미이다.
제1 정규화를 거친 표 중 fashion
이라는 테이블을 보면, 붉은 색으로 칠한 부분의 데이터가 겹친다는 것을 알 수 있다. 저 데이터는 상품
이라는 칼럼에 따라 결정된다. 그렇다면 fashion이라는 테이블에서 얻을 수 있는 정보는 상품의 가격은 제작 방식이 핸드메이드냐, 도매냐에 따라 달라진다는 점을 유추할 수 있다. 따라서 fashion
이라는 테이블은상품
, 가격
, 제작 방식
를 위해 존재하는 테이블이다.
그리하여 제2 정규화를 할 때, fashion
이라는 테이블은 부분 종속된 데이터만 가져간다. 또한, 제작 방식
이라는 칼럼이 없어졌기 때문에 두 원피스의 정보는 완전 일치하여서 중복을 제거하기 위해 한 행만 남겨둔다.
상품
, 제작 방식
그리고 이 두 칼럼에 의존하는 가격
를 가져와서 fashion_type
라는 테이블을 만들면 제2 정규화를 마친 것이다.
제2 정규화란, No transitive dependencies라는 조건에 만족하게끔 제2 정규형 테이블을 제3 정규형 테이블로 정규화하는 것을 말한다. No transitive dependencies는 이행적 종속성이 없어야 한다는 말이다.
제2 정규화를 거친 표를 보면, fashion
이라는 테이블의 행은 상품
이라고 하는 기본키에 종속되어 있다. 그렇다면디자이너_id
라고 하는 키는 당연히 상품
키에 종속되어 있다. 그런데 잘 보면, 디자이너
라고 하는 키는 디자이너_id
키에 종속되어 있다고도 말할 수 있다.
즉 디자이너_id
는 상품
에 의존하고, 디자이너
는 디자이너_id
에 의존하고 있다. 여기서 디자이너에 대한 상세한 정보가 더 추가되어도 그것은 디자이너_id
키에 의존하게 될 것이다. 이러한 관계를 이행적 종속성이라고 한다. 이행적 종속성은 나타나면 안 좋은 것이다. 그 이유는 붉은 색으로 칠한 부분을 보면 알 수 있다시피 값들이 중복되고 있다는 의미이기 때문이다.
이런 경우 중복을 나타내는 부분을 따로 표로 빼내야 한다. 때문에 제3 정규화를 거친 표를 보면 designer
라는 테이블이 추가되었음을 볼 수 있다. 원래는 두 행이 있었지만, 값이 중복되기 때문에 한 행만 남겨두고 지운다.
그리고 값들을 빼낸 fashion
테이블에는 designer
테이블과 이어지게끔 디자이너_id
라는 키를 남겨둔다. 이 경우에는 designer
테이블의 기본키를 외래키로 참조하는 것이기 때문에 중복이 허용되어서 지울 필요가 없다.
(id 키가 없다 하더라도, 내부적으로 성격이 비슷한 키들이 있다면 그것을 따로 빼내어 id를 부여해 지금처럼 기본키와 외래키로 연결시키면 된다.)
참고 자료