Database anomaly(=데이터베이스 이상현상)

1. update anomaly(=갱신 이상)

- 하나 바꾸려면 다 바꿔야함

- 데이터 갱신시 일관성 유지가 안되는 현상, 데이터 불일치(=inconsistency)발생

- 최유정 학생이 연락처를 변경하는 경우 B01, C01 튜플의 정보를 수정해야 하는데 1개의 튜플만 수정할 경우 발생

 

2. insert anomaly(=삽입 이상)

- 어떤 속성 값을 넣지 않는 이상 삽입이 불가능 

- 튜플 삽입시 지정하지 않은 속성값이 NULL을 갖는 현상

- 1604 홍길동 010-7777-3333 학생이 있으나 아직 수강하는 과목이 존재하지 않는 경우에는 과목코드에 NULL값이 저장되는 현상

 

3. delete anomaly(=삭제 이상)

- 연쇄 삭제에 의한 정보 손실

- 1602 서현진 학생이 A01 과목을 수강취소 하는 경우 해당 튜플이 삭제되어 의도치 않게 서현진 학생의 연락처 정보가 삭제되는 현상

 

이상의 원인 : Attribute 간에 존재하는 여러 종속 관계를 하나의 릴레이션에 표현, 하나의 테이블에 표현하기 때문이다.

해결책 : Attribute 간의 종속관계를 분석하여 여러개의 릴레이션으로 분해한다. -> Normalization(정규화)


Functionally dependency (FD, 함수 종속)

어떤 릴레이션(R)에서, Attribute X의 값 각각에 대해 Attribute Y의 값이 하나만 연관

X  Y : Y는 X에 종속

X는 Y를 결정한다. 즉 X는 Y의 결정자(determinant)

학번이 학년을 결정한다. 과목번호나 성적을 결정하진 못한다.

만약 학번이 성적을 결정하려면 성적이 다 과목마다 똑같아야 한다. 물론 실제로는 그렇지 않다.

 

  1. 하나의 테이블에서 X가 key 이면, R의 모든 attribute Y에 대해 X→Y가 성립한다.
    = X가 key라는 것은 값이 중복되지 않는다는 얘기이므로 당연히 결정자가 된다.
  2. X→Y일 경우 X가 반드시 key는 아니다.
    = 학번이 성적을 결정하지 않을 수 있다.

부분함수 종속 : 하나만 가지고 테이블 분해 (학번만)

완전함수 종속 : 두개 이상으로 테이블 분해 (학번, 과목번호 모두)

 

1NF  (부분함수 종속) → 2NF → (이행적함수 종속) → 3NF → (후보키가 아닌 결정자를 제거) → BCNF


Normal Form(정규형)

어떤 일련의 제약 조건을 만족하는 릴레이션

 

Normalization(정규화)의 원칙

  1. 정보가 유지돼야 한다.
  2. 중복성을 감소해야한다.
  3. 독릭접인 관계는 별개의 릴레이션으로 표현한다.

 

Functionally dependency 기준으로 Boyce-Codd Normal Form : 모든 결정자는 후보키

Multivalued dependency 기준으로 Fourth Normal Form 


1NF : 모든 속성은 반드시 하나의 값만 가져야 한다.

모든 도메인이 원자값(atomatic value)만으로 된 릴레이션

 

 

학번→지도교수

지도교수→학과

학번 → 학과

학번 + 과목번호 → 성적 

 


2NF : 모든 필드의 값은 반드시 기본 키에 종속되어야 한다.
기본키 일부에만 종속되어서는 안된다.

 

 

A B

B C 이렇게 찢는 것이 이행적 함수 종속

 

제 3 정규화 과정


3NF : 기본키가 아닌 모든 속성간에는 서로 종속될 수 없다.


Boyce-Codd Normal Form(BCNF)

보이스코드 정규화 과정

 

학번 과목코드 이름 연락처
1601 C01 강하늘 010-1234-0000
1601 C02 강하늘 010-1234-0000
1602 A01 서현진 010-3333-0000
1603 B01 최유정 010-5555-0000
1603 C01 최유정 010-5555-0000

 

 

 

Reference :

www.youtube.com/watch?v=pMcv0Zhh3J0

www.youtube.com/watch?v=kxeOZq24xX4&list=PLwaVnP-dAv340OykuIQcfCkirxYQs2Dr7&index=6

 

 

복사했습니다!