잘못 설계된 데이터베이스에서는 불필요한 데이터들의 중복이 발생하여 데이터의 삽입, 수정, 삭제, 연산을 수행할 때 부작용들이 발생할 수 있습니다. 이러한 부작용을 이상 현상이라고 합니다.
주로 세 가지 이상 현상이 존재합니다.
새로운 데이터를 추가할 때 불필요한 정보까지 입력해야 하는 상황을 말합니다. 자료를 삽입할 때 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상입니다.
예를 들어, 학생 정보와 과목 정보가 같이 저장된 테이블에 새 과목을 추가하려면, 해당 과목을 듣는 학생이 없더라도 임의의 학생 정보를 입력해야 하는 상황이 삽입 이상입니다.
어떤 정보를 삭제할 때 연관된 정보까지 함께 삭제되는 상황을 말합니다.
예를 들어, 학생 정보와 과목 정보가 같이 저장된 테이블에서 학생이 모든 과목을 듣지 않게 되면 그 학생의 정보가 데이터베이스에서 사라져버리는 상황이 삭제 이상입니다.
데이터를 수정할 때 일부 데이터만 변경하여 데이터 간 불일치가 발생하는 상황을 말합니다.
예를 들어, 같은 학생의 전화번호가 여러 곳에 저장되어 있어, 전화번호가 바뀌었을 때 모든 데이터를 갱신하지 않으면 일부는 바뀐 번호, 일부는 이전 번호로 표시되는 상황이 갱신 이상입니다.
함수 종속성이란, 데이터베이스에서 한 속성(혹은 속성 집합)의 값이 다른 속성(혹은 속성 집합)의 값을 결정짓는 관계를 말합니다.
함수 종속성의 기본 형태는 'X -> Y'로 표현되며, 이는 "X가 주어지면 Y를 결정짓는다"라는 의미입니다. 여기서 X를 결정자(Determinant), Y를 종속자(Dependent)라고 합니다.
예를 들어, '학번 -> 학생 이름'은 함수 종속성의 한 예입니다. 이는 특정 학번이 주어지면 그에 해당하는 학생 이름을 알 수 있다는 것을 의미합니다.
한 릴레이션에 복합키가 존재할 때, 속성(집합)이 그 복합키 전체에 의해 종속되는 경우를 말합니다.
예를 들어, {학번, 과목 코드} -> 성적
이 학번과 과목 코드 전체에 의해 결정되므로 완전 함수 종속성을 가집니다.
한 릴레이션에 복합키가 존재할 때, 속성(집합) 이 그 복합키의 일부에만 종속되는 경우를 말합니다.
예를 들어, {학번, 과목 코드} -> 학생 이름
에서 학생 이름은 학번에만 의존하므로 부분 함수 종속성을 가집니다.
한 속성(집합)이 다른 속성(집합)을 통해 간접적으로 종속되는 경우를 말합니다. 즉, X -> Y
, Y -> Z
가 종속 관계일 때, X -> Z
가 성립되는 경우입니다.
예를 들어, 학번 -> 학과
, 학과 -> 학과장
이 성립하면, 학번 -> 학과장
이 성립됩니다.
테이블 R 에 속한 모든 도메인이 원자값(atomic value) 만으로 구성되어 있는 경우
제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해한 경우
완전 함수 종속: 키의 부분 집합이 결정자가 되지 않음 (부분 종속 x)
=> 기본키가 '고객ID'와 '상품코드' 속성으로 구성되어있을 때 '제품명'은 기본키 중 '제품코드'만 알아도 식별 가능
이 경우에는 '제품명' 속성은 기본키에 부분 함수 종속된 관계
=> 하지만, '수량' 속성은 기본키를 알아야 식별이 가능
이 경우 '수량' 은 기본키에 완전 함수 종속된 관계
제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
이행적 종속: X, Y, Z라는 3 개의 속성이 있을 때 X→Y, Y→Z 이란 종속 관계가 있을 경우, X→Z가 성립
=> '제품코드' 로 '소분류' 를 알 수 있습니다.
=> '소분류' 로 '대분류' 를 알 수 있습니다.
=> 따라서 '제품코드' 로 '대분류' 를 알 수 있다. = 대분류는 소분류에 의해 관계되는 항목이지만, 제품코드를 통해 귀속
이행적 종속을 제거하지 않는다면, '소분류'에서 '컴퓨터 부품'을 수정한다면 모든 '컴퓨터 부품'이 포함된 튜플을 모두 수정해주어야 합니다.
제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해한 경우
후보키: 테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합.
후보키는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족
X → Y 일 때 X는 결정자, Y는 종속자
=> (학생, 과목) -> 교수 & 교수 -> 과목
=> 교수가 과목을 결정하는 결정자이지만, 후보키가 아니라는 점
=> 학생 / 교수 (함수적 종속x) , 교수 -> 과목
3정규형 또는 BCNF를 만족하면서 추가로 다치 종속(MVD, Multi-Valued Dependency)을 제거한 형태입니다.
다치 종속이란 하나의 속성이 다른 속성에 대해 여러 개의 값을 가지는 경우를 말합니다.
예를 들어, 한 사람이 여러 개의 전화번호를 가지고 있는 경우가 다치 종속의 예입니다. 이를 제거함으로써 데이터베이스의 무결성을 높일 수 있습니다.
4정규형을 만족하면서 추가로 조인 종속성을 만족하는 형태입니다.
조인 종속성이란 릴레이션을 분해한 후에 다시 조인 연산을 수행했을 때 원래의 릴레이션을 얻을 수 있는 성질을 말합니다.
정규화를 거치면 릴레이션 간의 연산(JOIN 연산)이 많아지는데, 이로인해 성능이 저하를 고려해 다시 정규화 이전 형태로 돌려 놓습니다.
데이터 조회 시 디스크 I/O량이 많을 때 부분적인 반정규화를 고려합니다.