디비를 잘못 설계하면 불필요한 데이터 중복이 발생하여 릴레이션(테이블)에 대한 데이터의 삽입,수정,삭제 연산을 수행할 때 부작용이 발생할 수 있는데, 이러한 부작용을 이상(anomaly)현상이라 한다.
고객 릴레이션이 있고 이벤트 릴레이션이 있다고 생각해보자.
그런데 두개가 합쳐져 있다면 어떨까?
예시 릴레이션을 생성해보자면,
CREATE TABLE 짬뽕_테이블 (
고객아이디,
이벤트번호,
담청여부,
고객이름,
등급
);
이런 릴레이션이 있다고 생각해보자.
만약에 kyu 라는 아이디를 가진 김동규가 이벤트1, 이벤트2, 이벤트3에 동시에 참여했다고 생각해보자.
그러면 이 짬뽕_테이블
에서 투플은 다음과 같이 생성되어진다.
INSERT INTO 짬뽕_테이블 VALUES (kyu, 이벤트1, Y, 김동규, gold);
INSERT INTO 짬뽕_테이블 VALUES (kyu, 이벤트2, N, 김동규, gold);
INSERT INTO 짬뽕_테이블 VALUES (kyu, 이벤트3, N, 김동규, gold);
이렇게 동일 데이터가 여러번 중복되어 저장되면 저장공간으 낭비할뿐만이아니라
릴레이션 데이터를 삽입 수정 삭제 할때 이상현상이 발생할 수 있다.
릴레이션에 새 데이터를 삽입하기 위해 원치않는 불필요한 데이터도 함께 삽입해야하는 문제를 삽입이상이라고 한다.
예를들어 이벤트에 참여하지 않은 roach 라는 아이디를 가진 사람을 삽입해보자.
INSERT INTO 짬뽕_테이블 (고객아이디, 고객이름, 등급) VALUES (roach, 로치, diamond);
하지만 넣을수 없다. 왜냐?
이벤트번호
와 담청여부
를 이벤트번호와 담청여부를 NOT NULL로 설정해놨기 때문이었다.
이때 이벤트번호
와 담청여부
를 어쩔수없이 삽입해줘야하므로 삽입 이상이 발생하게 된다.
INSERT INTO 짬뽕_테이블 VALUES (kyu, 이벤트1, Y, 김동규, gold);
INSERT INTO 짬뽕_테이블 VALUES (kyu, 이벤트2, N, 김동규, gold);
INSERT INTO 짬뽕_테이블 VALUES (kyu, 이벤트3, N, 김동규, gold);
UPDATE 짬뽕_테이블 SET kyu = 'sally' WHERE 고객아이디 = 'kyu';
이런 SQL의 작성 의도는 고객아이디를 바꿔주려고 했을것이다.
근데 지금 중복 투플들이 있으니 모든 kyu를 sally로 바꿔줘야하는 갱신이상이 생긴다.
릴레이션에서 투플을 삭제하면 꼭 필요한 데이터까지 함께 삭제하여 데이털가 손실돼는 연쇄삭제현상을 삭제이상이라 한다.
예를 들어서,
INSERT INTO 짬뽕_테이블 VALUES (kyu, 이벤트1, Y, 김동규, gold);
이 상태에서 이벤트 참석을 취소하고 싶어서
DELETE FROM 짬뽕_테이블 WHERE 이벤트번호 = 이벤트1;
이라는 쿼리를 줬다고 생각해보자.
그러면 고객데이터까지 같이 날려버리게 된다.
이게 삭제 이상이다.
이상현상을 발생하지 않게 하려면 관련있는 속성들끼리 묶어줘야하는데,
이를 위해 필요한 것이 정규화이다.
정규화는 이상현상이 발생하지 않도록, 릴레이션을 관련이 있는 속성들ㄹ만 구성하기 위해
릴레이션을 분해(decomposition)하는 과정이다.
정규화를 수행하려면 먼저 릴레이션을 구성하는 속성들 간의 관련성을 판단할 수 있어야한다.
정구화 과정에서 고려해야하는 속성들 간의 관련성을 함수적 종속성(FD; Functional Dependency)이라고 한다.
일반적으로 릴레이션에 함수적 종속성이 하나 존재하도록 정규화를 통해 릴레이션을 분해한다.
그래서 다음으로 배워야할건 함수 종속!