관계형 데이터베이스의 설계에서 레코드의 중복을 최소화하여 데이터를 구조화하는 프로세스
이상이란 테이블내의 데이터 중복성에 의해서 발생하는 데이터 불일치 현상이다. 주로 여러 종류의 레코드들을 하나의 테이블에 표현하려고 하면 이상현상이 발생한다. 이상현상의 종류는 다음과 같다
ex) 고객 아이디가
melon
이고 이름이진성준
등급이gold
인 신규 고객이 회원으로 가입하여 이벤트참여 테이블에 이 신규고객에 대한 데이터를 삽입해야한다고 가정해보자. 이 고객이 참여한 이벤트가 아직 없다면 이벤트 참여 릴레이션에 이 고객에 대한 데이터를 삽입할 수 없다.
ex) 고객 아이디가
apple
인 고객의 등급이gold
에서vip
로 변경되어야 한다면, 테이블의apple
고객에 대한 2개의 레코드의 등급 속성 값이 모두 수정되어야 한다. 하지만 어떤 이유로 1개의 레코드의 등급이 수정되면apple
고객이 서로 다른 등급을 가지는 모순이 생긴다.
ex) 고객 아이디가 orange
인 고객의 이벤트 참여가 취소되어 해당 레코드를 지워야 한다고 가정해보자. 그러나 이 레코드는 해당 고객에 대한 정보인 고객아이디
, 고객이름
, 등급
에 대한 정보도 유일하게 가지고 있다. 따라서 이 레코드가 삭제되면 고객의 이벤트참여와 관련이 없음에도 불구하고 해당 고객에 대한 모든 데이터가 원치 않게 손실되는 삭제 이상이 발생하게 된다.
위에서 발생하는 모든 문제들은 관련이 없는 데이터를 하나의 테이블에 모아두고 있기 때문에 생기는 이상 현상들이다. 따라서 관련 있는 속성들로만 구성하기 위해 테이블을 분해하는 과정인 정규화 작업이 필요하다.
테이블이 정규화된 정도는 정규형 (Normal Form)으로 표현한다. 정규형은 크게 기본 정규형(1~3, 보이스 / 코드 정규형) 과 고급 정규형(4,5 정규형)으로 나뉜다. 실무에서는 제 3정규형까지 주로 쓰인다.
각 로우마다 컬럼의 값이 1개씩만 있어야 한다. 이를 컬럼이 원자값(Atomic Value)를 가진다고 한다. 예를 들어 아래와 같은 테이블은 제 1 정규형을 위배한다고 볼 수 있다.
위 테이블이 제 1 정규형에 속하게 하려면 각 로우마다 이벤트 번호
와 당첨여부
컬럼 값을 하나씩만 포함하도록 분해해야 한다.
제 1정규형에 속하고, 기본키중에 특정 컬럼에만 종속된 컬럼(부분적 종속)이 없어야 한다는 것이다.
종속적이라고 하는 것은 예를들어 A라는 컬럼을 알면 B라는 컬럼을 알 수 있을 때 B는 A에 대하여 종속적이라는 표현을 사용한다. 종속 관계는 A -> B로 나타낼 수 있다.
김수형이라는 똑같은 이름을 가진 동명이인 고객이 있다. 따라서 하나의 로우를 구분하기 위해서는 고객이름
, 고객아이디
즉, 2개의 컬럼이 필요하다. 따라서 2개의 컬럼으로 기본키를 구성해야 한다. 하지만 고객아이디
컬럼의 값을 알면 나이
를 알 수 있다.
따라서 나이
컬럼은 2개의 기본키중 일부인 고객아이디
컬럼에 대해서 종속적이라고 볼 수 있다.
위와 같은 부분적인 종속을 해결하기 위해서는 테이블을 다음과 같이 쪼갤 수 있다.
제 2정규형의 속하고, 기본키가 아닌 모든 컬럼의 이행적 종속을 제거하는 과정이다. 이행적 종속이란 테이블 내의 속해있는 기본키를 제외한 특정 컬럼이 다른 컬럼을 결정하는 것을 뜻한다.
위 테이블의 이벤트번호
컬럼을 알면 당첨여부
컬럼을 알 수 있다.
다른 말로 하면 이벤트번호
컬럼이 당첨여부
컬럼을 결정한다 라는 표현을 쓸 수 있다.
따라서 당첨여부
컬럼이 이벤트번호
컬럼에 대해서 이행 종속적이다
이벤트번호 -> 당첨여부
이런 이행 종속을 제거하기 위해 2개의 테이블로 분해할수 있다.