: 불필요한 데이터 중복으로 인한 공간낭비 + 사이드 이펙트 (a.k.a. 삽입 이상, 갱신 이상, 삭제 이상) 발생을 해결하기 위해 정규화 해야한다.
예시 테이블 course: professor = 1 : 1 가정
STUDENT_ID | COURSE_ID | PROFESSOR_NAME | GRADE | STUDENT_NAME |
---|---|---|---|---|
1 | OS123 | 김ㅇㅇ | B | 김ㅇㅇ |
1 | ALG123 | 권ㅇㅇ | F | 김ㅇㅇ |
2 | ALG123 | 권ㅇㅇ | A | 이ㅇㅇ |
3 | NET123 | 최ㅇㅇ | B+ | 최ㅇㅇ |
4 | OS123 | 김ㅇㅇ | A+ | 손ㅇㅇ |
반정규화
: 정규화로 인해 오히려 join 비용이 증가하는 경우가 있을 수 있다. 이 때 join한 컬럼을 기준으로 반정규화. DB를 설계할 때 SQL의 성능, 모델의 단순성 등을 고려해서 정규화를 해야한다.
이상 현상
삽입 이상: 새 데이터를 삽입하기 위해 NULL 불가한(기본키 중 하나인 경우?) 컬럼에 불필요한 데이터도 삽입해야하는 문제
수업을 수강하지 않은 학생을 테이블에 넣기 위해 course_id 컬럼에
미기입
이라는 불필요한 정보를 써넣어야 하는 경우갱신 이상: 중복된 튜플 중 일부 컬럼(속성)을 갱신할 때 데이터 부정합이 발생하는 문제
수업의 교수가 바뀌어 변경해야 할 때 모든 튜플의 해당 컬럼을 변경해줘야 하는 경우
삭제 이상: 튜플을 삭제함으로써 꼭 필요한 데이터(필요한 컬럼의 정보)까지 연쇄적으로 삭제되는 문제
학생이 수강을 취소해 강의를 삭제해야 할 때 학생 이름, 학번까지 없어짐
함수적 종속성
: 어떠한 릴레이션에서 속성들의 부분집합이 X, Y에서 X -> Y
관계일 때 Y가 X에 종속
. 이 때 X가 Y를 함수적으로 결정하고, 각각 결정자, 종속자 라고 한다.
- 위에 예시에서 종속성은 아래와 같이 표현 가능
STUDENT_ID -> STUDENT_NAME - 부분 함수 종속
COURSE_ID -> PROFESSOR_NAME - 부분 함수 종속
{ STUDENT_ID, COURSE_ID } -> GRADE - 완전 함수 종속
완전 함수 종속, 부분 함수 종속?
부분 함수적 종속
- 속성 Z가 속성집합 { X, Y } 전체가 아닌 일부분에도 함수적으로 종속됨
완전 함수적 종속
- 속성 Z가 속성집합 { X, Y } 전체에 함수적으로 종속됨
Reference)
https://yaboong.github.io/database/2018/03/09/database-anomaly-and-functional-dependency/
https://wkdtjsgur100.github.io/database-normalization/
https://nirsa.tistory.com/107