![](https://velog.velcdn.com/images/rg970604/post/11530780-aa96-4215-ae91-a1df707e66e2/image.png)
- 정규화는 이상현상을 제거하기 위해 이루어지는 것이다.
![](https://velog.velcdn.com/images/rg970604/post/f496f8c2-cca2-4a97-bd23-68b0972e4d8b/image.png)
- 따라서 이상현상을 이해하고 정규화의 필요성을 이해하며, 정규화를 위한 함수 종속성 및 정규형의 유형과 관계 이해가 필요하다.
![](https://velog.velcdn.com/images/rg970604/post/9d4b3f3d-101c-4b16-b236-748a2ee268f8/image.png)
- 정규화는 이상현상을 제거하며 데이터베이스를 설계하는 과정이다.
- 이상현상은 불필요한 데이터 중복으로 데이터를 변경할때 발생하는 부작용이다.
![](https://velog.velcdn.com/images/rg970604/post/e17daf74-8192-430d-8227-d7f89faea5bc/image.png)
- 이상 현상은 삽입 이상(불필요한 데이터 함께 삽입), 갱신 이상(중복 투플 중 일부만 변경하여 데이터 불일치), 삭제 이상(투플 삭제시 필요한 데이터가 함께 삭제)이 존재한다.
![](https://velog.velcdn.com/images/rg970604/post/ae560dd9-0534-462f-999f-7d42844205a2/image.png)
![](https://velog.velcdn.com/images/rg970604/post/204d87f4-3317-4b29-b328-f4f9af337584/image.png)
- 위 릴레이션에서 삽입이상이 발생하는지 확인하겠다.
![](https://velog.velcdn.com/images/rg970604/post/78561775-71e7-402a-8d36-c59ea8eb990b/image.png)
- 위 경우 melon 아이디 고객을 삽입하려는데, 이벤트번호가 널 값일 경우에는 이벤트 참여 릴레이션에 삽입이 불가하다. 따라서 삽입 이상이 발생한다. 따라서 임시 이벤트번호를 주어야지만 참여할수 있는 문제가 있다.
![](https://velog.velcdn.com/images/rg970604/post/a6439dd4-bf2b-41af-8989-aec20c7e5a98/image.png)
![](https://velog.velcdn.com/images/rg970604/post/21e8e247-513a-49fb-8d0d-1e80ff0ab9ff/image.png)
- apple 아이디를 가진 투플이 세 개가 있다. apple이 등급이 gold에서 vip로 상승했는데 한 투플의 등급이 그대로 gold면 불일치로 갱신 이상이 발생한다.
![](https://velog.velcdn.com/images/rg970604/post/74047721-9798-4fbf-98ff-048ca6576337/image.png)
![](https://velog.velcdn.com/images/rg970604/post/71512df5-199b-4248-accc-15caf6d69d37/image.png)
- orange 고객이 이벤트 참여를 취소할때 투플이 삭제되는데, 이때 id,이름,등급이 모두 삭제되므로 삭제 이상이 발생한다.
![](https://velog.velcdn.com/images/rg970604/post/42c365b7-ffa0-4550-b787-2715d9871334/image.png)
- 정규화는 위 세 이상현상이 발생하지 않도록 릴레이션을 관련 있는 속성들로만 구성하기 위해 릴레이션을 분해하는 것이다.
- 속성 간의 관련성인 함수적 종속성을 판단하여 정규화를 수행한다.
![](https://velog.velcdn.com/images/rg970604/post/c279a3f3-d040-4444-bbaa-03888bbe6a4d/image.png)
- 함수 종속은 하나의 X값에 대한 Y값이 항상 하나인 것이다. Y값이 두개라면 함수 종속 관계가 될 수 없다.
![](https://velog.velcdn.com/images/rg970604/post/0a1ee9e4-145a-49b5-812b-b30b1fd4cd57/image.png)
- 위처럼 y값인 1이 x값 중 a에도 들어갈 수 있고, b에도 들어갈 수 있으면 함수 종속이 아니다.
- x와 y는 하나의 릴레이션을 구성하는 속성들의 부분 집합이다.
- Y가 X에 함수적 종속되면 X->Y로 표현한다.
![](https://velog.velcdn.com/images/rg970604/post/8d3f73eb-3497-4916-80ba-cd536edaf118/image.png)
- 위 경우 고객아이디에 따라 등급이 달라지므로 고객아이디->등급 관계가 성립한다.
- 또 고객아이디->고객이름 관계도 성립한다. 아이디에 따라 하나의 이름이 매칭되기 때문이다.
- 또는 고객아이디 ->(고객이름,등급) 으로 표현 가능하다
- 만약 apple과 orange 아이디가 동명이인일 경우 고객이름에 따른 등급이 여러개 매칭되므로 함수적 종속관계가 아니다.
![](https://velog.velcdn.com/images/rg970604/post/89f82fbf-c42f-4867-9aa5-7c1e8e8b5ac4/image.png)
- 함수 종속 관계를 도식화하여 위처럼 다이어그램으로 표현한 것이 함수 종속 다이어그램이다.
![](https://velog.velcdn.com/images/rg970604/post/18ea963e-c302-4552-bd01-74beaf8875b9/image.png)
- 함수 종속관계 판단시 유의할 점은 속성 값은 계속 변할 수 있어 현재 릴레이션에 포함된 속성 값만으로 판단하면 안된다. 따라서 속성 자체의 특성과 의미를 기반으로 함수 종속성을 판단해야 한다.
- 일반적으로 기본키와 후보키는 릴레이션의 다른 모든 속성들을 함수적으로 결정하는 결정자 역할을 함을 알아두자
- 그러나 기본키나 후보키가 아니어도 다른 속성 값을 유일하게 결정하는 속성이 있으면 결정자가 될 수 있다.
![](https://velog.velcdn.com/images/rg970604/post/cd6a0ede-ec03-41b5-84b5-f36ff3e80419/image.png)
- 위 경우 어떤 함수 종속 관계가 있을까.
- 먼저 고객아이디가 이름을 결정한다.
- 당첨여부는 고객아이디와 이벤트번호 조합으로 결정된다.
![](https://velog.velcdn.com/images/rg970604/post/0ec4441c-588f-4d19-bedd-8f8591df6fbb/image.png)
- 위처럼 고객아이디와 이벤트번호의 조합으로 당첨여부가 판단된다
- {고객아이디,이벤트번호}->고객이름 의 경우 고객이름은 이벤트 번호가 아닌 고객아이디에만 종속되어 있다, 이 경우 고객이름은 {고객아이디,이벤트번호}에 부분 함수 종속되었다고 표현한다.
![](https://velog.velcdn.com/images/rg970604/post/aaf390a5-212b-45b5-acc2-84957f8d8f72/image.png)
- 완전 함수 종속과 부분 함수 종속 개념이 있다. 일반적으로 우리가 아는 종속관계가 완전 함수 종속이다. 속성 집합 Y가 속성 집합 X의 전체에 종속된 것이다.
- 부분 함수 종속은 Y가 X에 일부분에 종속된 것이다.
![](https://velog.velcdn.com/images/rg970604/post/c463255e-f956-4752-8e95-b1d8630702cd/image.png)
- 이행적 함수 종속은 릴레이션을 구성하는 세 개의 속성 집합 에서, X->Y와 Y->Z가 존재하면 논리적으로 X->Z 가 성립한다. 이 경우 Z가 X에 이행적으로 함수 종속되었다고 한다.
- 고객아이디->등급, 등급->할인율 이므로 고객아이디->할인율 관계가 형성되는 경우다.
![](https://velog.velcdn.com/images/rg970604/post/5198179b-968e-40eb-a4c6-b7a1ada078da/image.png)
- 위와 같이 결정자=종속자 결정자>종속자 처럼 당연한 함수 종속 관계는 고려하지 않는다.