alt
Home DB 정규화가 필요한 이유와 함수적 종속
Post
Cancel

DB 정규화가 필요한 이유와 함수적 종속

: 불필요한 데이터 중복으로 인한 공간낭비 + 사이드 이펙트 (a.k.a. 삽입 이상, 갱신 이상, 삭제 이상) 발생을 해결하기 위해 정규화 해야한다.


예시 테이블 course: professor = 1 : 1 가정

STUDENT_IDCOURSE_IDPROFESSOR_NAMEGRADESTUDENT_NAME
1OS123김ㅇㅇB김ㅇㅇ
1ALG123권ㅇㅇF김ㅇㅇ
2ALG123권ㅇㅇA이ㅇㅇ
3NET123최ㅇㅇB+최ㅇㅇ
4OS123김ㅇㅇ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

This post is licensed under CC BY 4.0 by the author.