DB 정규화 (정규화 편)

갈아만든배·2023년 6월 8일
0
post-thumbnail

데이터베이스 정규화에 대해 알아보자.

데이터베이스 정규화란.

이전 글에서 정규화에 종류와 정규화란 무엇인가에 대해 설명을 했으니, 이제는 각각의 정규화의 종류와 간단한 예제를 통해 각각의 정규화 단계들을 정리해보자.

1형 정규화.

1형 정규화란 테이블 내의 모든 값이 더 이상 나눌 수 없는 단일 값을 가지도록 데이터들을 나누는 것이다.

데이터의 원자성을 유지하기 위해서는 데이터베이스의 각각 필드에는 하나의 값만 저장되어야 한다는 원칙이 지켜져야만 한다.

앞서 살펴보았던 이상 현상들의 예제처럼 데이터들의 원자성이 지켜지지 않으면 이상 현상이 발생하기 때문에, 데이터들의 원자성을 보장하기 위해서 가장 먼저 진행하는 정규화가 바로 1형 정규화이다.

그럼 아래의 예제를 먼저 살펴보자.

해당 테이블은 고객이 작성한 문의 내용을 저장하는 게시판 테이블의 일부이다.

해당 문의글에서 고객은 파손된 상품에 대한 교환 요청을 위해 문의글을 작성하는 도중 파손 상태에 대해 찍은 상품의 사진을 첨부하였는데, 이 때 고객은 한 장 이상의 사진을 첨부할 수 있다.

해당 문제를 해결하기 위해 위의 사진과 같이 첨부 파일 하나당 컬럼 하나를 추가하는 방법도 있었으나, 추후 고객이 첨부할 수 있는 파일의 양이 증가할 때 마다 컬럼을 하나씩 늘려 나가야 하는 문제 때문에 기각되었다.

해당 테이블 구조의 문제점은, n개 이상의 데이터가 한 컬럼 내에 존재한다는 것이다. 이는 데이터의 원자성을 해치는 구조이다.

컬럼 내의 데이터는 더 이상 나눌 수 없는 유일한 식별자를 가진 값이여야 데이터의 원자성과 일관성을 유지할 수 있게 된다.

아래는 1형 정규화를 진행한 이후의 테이블이다.

위의 정규화를 진행하기 전의 테이블을 확인해보면 '첨부 파일' 이라는 이름을 가진 컬럼 내에 여러 첨부 파일의 정보가 ' , ' 값으로 구분되어 저장되어 있었는데 이를 더 이상 나눌 수 없는 단일 값을 가질 때 까지 데이터를 분리한 것이다.

이로써 해당 테이블은 데이터의 원자성을 유지하는 테이블로 1형 정규화가 진행되었다고 볼 수 있다.

2형 정규화.

2형 정규화는 기본적으로 1형 정규화를 만족하고 있다는 가정하에 진행된다.

정규화는 큰 틀에서부터 각각의 정규화를 거치면서 세부적으로 진행되므로 2형 정규화는 1형 정규화를 만족하고 있는 테이블에서 진행해야 한다.

위에서 알아본 대로 1형 정규화를 만족하고 있는 테이블의 컬럼은 각각 원자성을 유지하는데, 이 때 해당 테이블 내의 데이터가 부분 함수 종속이 이루어지도록 분해하는 것이 2형 정규화이다.

부분 함수 종속이 뭔데?

부분 함수 종속이란 해당 테이블의 식별자가 아닌 비 식별자에 의해 값이 종속되는 것을 말한다.

위에서 예시에 이용했던 문의 테이블을 다시 보자.

위의 테이블과 같이 작성자 명에 고객 명을 저장한 문의 테이블이 있다고 가정해보자.

해당 테이블은 현재 문의글에 대한 정보를 저장하고 있으므로 해당 테이블의 식별자는 문의글 id라고 볼 수 있는데,
위의 테이블을 다시 보면 문의글 테이블 내의 고객 명 컬럼은 문의글 id가 아닌 고객 id에 종속되어 있다.

고객의 아이디를 알면 문의글 id를 몰라도 고객 명을 알 수 있는 것이다.

이런 상황이 발생할 경우, 우리는 부분 함수 종속이 존재한다고 판단할 수 있다.

위에 상황에서 고객 명이 변경될 경우가 생긴다면, 우리는 고객 테이블과 해당 고객이 남긴 문의 테이블의 정보를 함께 변경해야 하는 상황이 생기는 것이다.

이제 2형 정규화를 적용해보자.

2형 정규화가 적용된 이후의 문의 테이블이다. 이전 처럼 고객 명을 함께 저장하는 것이 아니라 고객의 정보는 고객 테이블에 두고 해당 고객의 식별자만 문의글 테이블에 저장했다.

이렇게 나누면 이후에 고객 테이블의 정보가 변경되더라도 해당 고객의 식별자가 바뀌지 않는 이상은 해당 고객의 정보의 변경을 신경쓸 필요가 없어진다.

3형 정규화.

이제 3형 정규화에 대해 알아보자.

3형 정규화는 2형 정규화까지 진행된 상태에서 이행 함수 종속이 발생하지 않게 정규화를 진행하는 것을 말한다.

이행 함수 종속?

이행 함수 종속은 쉽게 말하면 A -> B, B -> C 이므로 A -> C 인 상황이 발생하는 것을 말한다.

예를 들어, 집 앞에 자주 가던 카페에서 10회, 30회, 50회 이상 커피를 구매한 고객들에게 실버, 골드, 다이아 등급을 부여해 각각 5%, 10%, 15%의 할인을 적용한다고 가정해보자.

만약 내가 해당 카페에서 10회 이상 커피를 구매했을 경우, 나는 실버 등급을 부여받으며 이후 결제 시 5%의 할인율을 적용받는다.

이를 이행 함수 종속의 관점에서 설명해보면

고객(나) -> 실버 (A -> B)

실버 -> 5% 할인 (B -> C)

고객(나) -> 5% 할인. (A -> C)

의 형태로 종속되는 것을 확인할 수 있다.

이를 토대로 다시 아까의 고객 테이블을 다시 살펴보자.

예시를 들었던 대로,

카리나라는 고객 ID를 가진 고객의 등급은 현재 GOLD 이다. (A -> B)

해당 등급에 해당하는 할인율은 10% 이다. (B -> C)

그러므로 카리나는 결제 시 마다 10%의 할인을 받는다. (A -> C)

이 때 고객은 자신의 등급에 해당하는 식별자만 알고 있으면 해당 등급에 해당하는 할인율을 알 수 있게 된다.

그러므로 굳이 고객 테이블의 등급에 해당하는 할인율을 같이 저장하지 않아도 등급에 대한 정보만 저장하고 있으면 해당 등급을 토대로 할인율을 식별할 수 있으므로 할인율이라는 컬럼을 삭제할 수 있는 것이다.

이렇게 등급과 할인율을 따로 분리해 등급 테이블을 만들면, 고객이 늘어날 때 마다 해당 고객의 등급 별 할인율을 굳이 매번 저장하지 않아도 되는 것이다.

결과적으로 고객 테이블에서 할인율 컬럼 만큼의 중복을 제거할 수 있게 된다.

0개의 댓글