![](https://velog.velcdn.com/images/rg970604/post/bc9c80af-51d8-44e7-8abe-fe7dbb95702b/image.png)
- 정규화는 이상현상이 발생하지 않는 릴레이션을 만들어 가는 과정이다.
- 정규화를 통해 릴레이션 분해 시 무손실 분해, 즉 분해로 인한 정보의 손실이 발생하지 않아야 한다.
![](https://velog.velcdn.com/images/rg970604/post/0a0f9799-9bd3-4e79-94ca-30f26ca8f454/image.png)
- 정규형은 릴레이션이 정규화된 정도를 의미한다.
- 각 정규형마다 제약조건이 존재되며 차수가 높아질수록 제약조건이 높아진다.
![](https://velog.velcdn.com/images/rg970604/post/007fe603-86e4-4e05-b9ca-c71151e7e88e/image.png)
- 정규형은 기본 정규형과 고급 정규형을 합해 총 6개 정규형으로 구분된다.
![](https://velog.velcdn.com/images/rg970604/post/d5aa6851-dd73-4ecc-a10f-7f01572aa57d/image.png)
- 차수가 높아질수록 제약조건이 높은 것을 알 수 있다.
![](https://velog.velcdn.com/images/rg970604/post/114d0dd3-6e6a-4ce7-b8f7-229798e2c220/image.png)
- 제 1 정규형은 릴레이션의 모든 속성의 도메인이 다중 값이 아닌 원자 값으로만 구성되어야 하는 것이 조건이다.
![](https://velog.velcdn.com/images/rg970604/post/586197c5-98cb-44b4-a823-eacc8547a63e/image.png)
- 위 이벤트 참여 릴레이션에서 이벤트번호, 당첨여부 속성은 다중 값을 가지므로 제 1 정규형을 만족하지 않았다.
![](https://velog.velcdn.com/images/rg970604/post/00e1df2c-58de-4ef5-831d-187f7b0dd6bb/image.png)
- 따라서 위의 다중 값을 모두 별개의 투플로 나눠 표현하면 제 1 정규형을 만족하게 된다.
![](https://velog.velcdn.com/images/rg970604/post/39a8084c-c29b-4759-add3-dd342a3c7560/image.png)
- 그러나 제 1 정규형을 만족해도 데이터 중복으로 인해 이상 현상이 발생할 수 있다.
![](https://velog.velcdn.com/images/rg970604/post/e57f56ad-33f3-4f45-9d8b-776296a2cdfc/image.png)
- 함수 종속 다이어그램으로 제 1 정규형은 만족하지만 이상현상이 발생하는 릴레이션을 표현한 것이다.
- 고객아이디와 이벤트번호가 당첨 여부를 결정한다.
- 고객아이디가 등급을 결정한다. 등급이 할인율을 결정하므로 고객아이디가 할인율을 결정하는 이행적 함수종속이 발생한다.
![](https://velog.velcdn.com/images/rg970604/post/b635feaf-a0c5-4563-99c6-46619ad2bf73/image.png)
- 등급과 할인율이 기본키(고객아이디,이벤트번호)에 완전 함수 종속되지 못했으므로 이상 현상이 발생한다.
![](https://velog.velcdn.com/images/rg970604/post/8af210f6-8716-4232-bed0-01c11bca329b/image.png)
![](https://velog.velcdn.com/images/rg970604/post/e6d371d7-534f-4e37-ba9c-872453059b36/image.png)
- 그러므로 릴레이션이 제 1 정규형에 속하고 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2 정규형을 만족한다.
![](https://velog.velcdn.com/images/rg970604/post/01ccad71-08d2-4d2d-b9f0-91fed4af0897/image.png)
- 위처럼 부분 함수 종속시 부분 함수 종속을 제거하여 릴레이션을 두개로 분해하면 제 2 정규형을 만족한다.
![](https://velog.velcdn.com/images/rg970604/post/0bd98cef-aa91-4af0-9adb-1e1245e7006d/image.png)
![](https://velog.velcdn.com/images/rg970604/post/f0fbb065-74ba-4767-a0d7-69044c35a7cd/image.png)
- 위처럼 이벤트 참여 릴레이션을 고객릴레이션과 이벤트참여 릴레이션으로 분해하여 제 2 정규형을 만족시킨다.
![](https://velog.velcdn.com/images/rg970604/post/22964c3a-5db3-4e39-8196-0579dc7df06c/image.png)
- 그러나 제 2 정규형을 만족해도 이상현상이 발생할 수 있다.
![](https://velog.velcdn.com/images/rg970604/post/51f8d8f3-ca1c-4445-9cb4-b39b45d0dd3f/image.png)
- 위와 같이 같은 등급별 할인율 차이 데이터 불일치로 인한 갱신 이상이 발생할 수 있다.
- 또 아이디를 지우는데, 해당 등급에 존재하는 아이디가 그 아이디 하나면 삭제 이상이 발생할 수 있다.
- 또 브론즈 등급을 생성하려는데 그에 해당하는 회원이 없으면 삽입 불가로 인한 삽입 이상이 발생한다.
- 이러한 이상 현상은 이행적 함수 종속의 존재로 발생하는 것이다.
![](https://velog.velcdn.com/images/rg970604/post/70549c59-ce11-4ded-9e18-56393d4fd30f/image.png)
- 따라서 제 3 정규형을 만족시키기 위해 이행적 함수 종속을 분해해야 한다.
![](https://velog.velcdn.com/images/rg970604/post/e059f0da-5492-4a72-9083-7fd3f4be7ef0/image.png)
- 릴레이션이 제 2 정규형에 속하고 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속되지 않으면 제 3 정규형을 만족한다.
![](https://velog.velcdn.com/images/rg970604/post/cdbf1b27-6753-4f47-bc72-063baa71259f/image.png)
![](https://velog.velcdn.com/images/rg970604/post/1e7fb1c5-9941-48cd-ab87-bcf274efa6b0/image.png)
- 고객아이디가 할인율을 이행적 함수 종속을 통해 결정하므로 제 3 정규형을 만족하지 못한다. 따라서 고객 릴레이션과 고객등급 릴레이션으로 분해시켜 이행적 함수 종속을 제거한다.
![](https://velog.velcdn.com/images/rg970604/post/a83ffcc7-2803-4098-a0e3-228720c9b78d/image.png)
- 즉 두 릴레이션이 모두 제 3 정규형에 속하게 된다.
![](https://velog.velcdn.com/images/rg970604/post/fc2bf720-2d3e-4afb-a3f2-0398bc53f525/image.png)
- 위 경우 어떤 이상이 발생할까?
- 먼저 학번과 과목번호가 기본키로 되어 있으므로 수강신청을 하지 않은 학생은 릴레이션에 삽입할 수 없어 삽입 이상이 발생한다. 임시 과목번호를 주어야만 삽입이 가능한 한계가 있다.
- 한 명의 학생이 여러 과목을 수강하면 중복되어 투플에 기재될 것이다. 만약 학생의 지도교수가 바뀌면 모든 투플이 갱신되어야 하는데, 일부만 갱신되면 갱신 이상이 발생한다.
- 만약 한 과목만 신청한 학생이 있을 때 릴레이션에서 그 학생의 투플이 하나인데 수강신청을 취소할 경우 투플이 사라진다. 투플 삭제시 학생 정보 및 과목정보가 사라지게 되므로 삭제 이상이 발생한다.
![](https://velog.velcdn.com/images/rg970604/post/6f11e452-5726-4b5a-9a94-f5fa8f9d215e/image.png)
- 모든 릴레이션이 2정규형을 만족하도록 분해해보자
![](https://velog.velcdn.com/images/rg970604/post/c8631e3d-07c1-426b-8c30-5a4ff82e9557/image.png)
- 2정규형 만족을 위해 부분 함수 종속을 제거해야 한다. 과목번호와 학번, 성적을 별개의 릴레이션으로 분해한다.
![](https://velog.velcdn.com/images/rg970604/post/36feb97d-a893-49f5-a2ba-2087efe140b2/image.png)
- 2정규형 릴레이션을 3정규형을 만족하도록 분해해 보자.
![](https://velog.velcdn.com/images/rg970604/post/afb103f7-049e-49a0-9dbd-c194240907b5/image.png)
- 이행적 함수 종속을 제거해야 한다. 학번->학과이름->학과전화번호, 학번->(회장이름,동아리이름)->방번호의 이행적 함수 종속을 제거해야 한다.
- 따라서 별도의 릴레이션을 구성해주어야 3정규형을 만족한다.