티스토리 뷰

이상현상에는 삽입이상, 삭제이상, 갱신이상 3가지 이상현상이 존재한다. 이상현상이란 테이블내의 데이터 중복성에 의해서 발생되는 데이터 불일치 현상이다.


삽입 이상 현상


내가 원하는 값만 테이블에 삽입하고 싶은데, 테이블에 필요하지 않은 필드들 때문에 원치 않는 필드의 값도 삽입해야 하는 경우 발생

나는 1,2,3번 필드에 대한 값만 테이블에 넣고 싶은데 테이블이 4개의 필드로 구성되어 있기 때문에 마지막 필드 값을 무엇으로 해야 할지 결정하지 못하는 삽입 이상 현상이 발생 되었다.


삭제 이상 현상

내가 원하는 값만 테이블에서 삭제하고 싶은데, 하나의 튜플이 삭제를 원하지 않는 속성값도 갖고 있기 때문에 같이 지워져서 발생하는 문제.


나는 지금 운영체제 성적 82라는 정보만 삭제하고 싶다. 근데 테이블이 더 많은 수의 필드로 구성되어 있기 때문에 이것을 지우려면 다른 지우고 싶지 않은 필드들의 정보도 같이 지워야 한다. 이것이 삭제 이상 현상이다.



갱신 이상 현상

어떤 값을 업데이트 했을때 그 속성의 다른 속성값들과의 불일치가 발생하는 현상.

위와 같이 첫번째 튜플의 이름 = 김사랑을 김소연으로 고치게 될 경우 3번째 튜플의 내용과 불일치가 발생함. 이것이 발생하지 않게 하려면 김사랑 값을 갖는 모든 튜플을 일일이 다찾아서 수정해주어야함.



이러한 이상현상들은, 테이블내의 데이터 중복성 때문에 발생하는 현상이다. 이런 이상현상들이 발생하지 않게 하기 위해서는 테이블을 정규화 해주어야 한다.


정규화

제1정규화,제2정규화,제3정규화,BNF정규화 까지만 살펴보기로 하자.




부분 함수 종속

기본키가 여러개의 필드로 구성되어 있을때, 그 중 일부 필드에 의해서 또다른 속성이 결정된다면 이것은 부분 함수 종속성이 존재하는것이다. 

{학번,과목번호}로 구성된 기본키가 성적을 결정하는 상황에서 학번이 학년을 또 결정하고 있다. 이렇듯이, 기본키에 속하는 어떤 부분 필드가 또 다른 속성을 결정하게 되는것을 부분 함수적 종속이라고 표현한다. 제1정규형에서 부분적 함수 종속성을 제거하면 제2정규형 테이블이 된다.


이행 함수 종속



위와 같이 학번이 자격증을 결정하고 자격증이 자격증 번호를 결정할때 학번이 또 자격증번호를 결정하게 되면 이 테이블에는 이행적 함수 종속성이 존재하는것이다. 제2정규형 테이블에서 이행적 함수 종속성을 없애주면 제3정규형 테이블이 된다.


결정자


어떤 X 속성이 정해지면 Y속성이 그에 따라 자동적으로 결정될때 X를 결정자라고 한다. 또한 Y는 X에 함수적 종속 된다. 라고 표현한다. 또한, 표기는 아래와 같이 한다.


X->Y


모든 결정자가 후보키여야 BNF을 만족하게 되는데 그 말은 다른 속성들을 결정하는 모든 속성들이 후보키여야 한다는것이다.


보이스코드 정규형 (BNF)는 결정자가 후보키이므로, 데이터 중복성이 절대 발생하지 않는 정규형이다.

이것은 아주 강력한 제약 조건이다.


정규화를 하면 할 수록 데이터 불일치가 발생하지 않기 때문에 여러가지 이상현상을 제거할수 있지만

정규화를 하면 할 수록 테이블을 잘게 쪼개기 때문에 나중에 다시 테이블을 합치는 조인 연산을 많이 해야 한다. 조인 연산은 I/O cost가 높은 연산이기 때문에, 결국 정규화를 할 수록 퍼포먼스가 떨어진다는 단점이 있다.


즉, 정규화는 무조건 할수록 좋은것이 아니다. 퍼포먼스를 위해서 BNF까지 정규화 하는것이 아니라, 제3정규형까지만 정규화 하는일도 흔하다.


정규화를 한다는것은 테이블을 쪼갬으로써 데이터 중복성을 없애서 여러 이상 현상을 제거 하는 작업이다.


테이블을 쪼갤때, 주의 해야 할점이 있다.


1. 무손실 조인

2. 의존성 보존


무손실 조인이란 하나의 테이블을 2개의 테이블로 쪼갰을때 그 2개의 테이블을 다시 조인하게 되었을때 원래의 테이블이 나와야 한다는것이다.


의존성 보존이란, 원래 쪼개기전 테이블에 있었던 속성간 함수 종속성이 쪼개고 난 다음 2개의 테이블의 함수 종속성에서도 그대로 똑같이 보존 되어야 한다는 것이다.


A라는 테이블에 a,b,c,d,e라는 속성이 존재하고 이것을 B와 C테이블로 쪼갠다고 해보자.

이때 B테이블에는 a,b,c속성이 들어갈수 있고 C테이블에는 c,d,e 속성이 들어갈수 있다. 조인속성은 쪼개진 두개의 테이블에 모두 있어야 나중에 조인을 할 수 있다.

-> 위와 같은 방식으로 테이블을 분해하면 무손실 분해, 무손실 조인이 가능하다.


무손실 분해는 위와 같은 방식으로 테이블을 분해하는 경우 항상 가능하다.

하지만 의존성 보존은 테이블을 쪼갰을때 항상 보존 되지 않는다.


제3정규형까지 분해를 하게 되면 의존성 보존이 되지만 분해하여 BNF로 만들었을 경우 의존성 보존은 보장하지 못한다.

그렇기 때문에 최대한 제3정규형까지 테이블을 분해하는것은 거의 항상 옳지만, 보다 더 깊은 정규화를 할것인가는 퍼포먼스를 고려하여 데이터베이스 설계자의 선택에 따라 달라질 수 있다.





'컴퓨터 공학과 졸업 > 데이터베이스' 카테고리의 다른 글

무결성 제약조건  (0) 2018.06.28
인덱스  (0) 2018.06.27
응용 데이터베이스 정리  (0) 2018.04.18
[정보처리기사] 정규화 정리  (0) 2018.03.29
내부조인,외부조인  (0) 2018.03.26
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함