데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)과 이상현상 해결을 위해 엔티티를 작은 단위로 분리하는 과정
튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상
데이터 베이스의 Table내 하나의 컬럼에 여러 값이 들어가 있는 상황에서
데이터베이스의 각 컬럼이 하나의 데이터만 가지도록 하는 과정이다.
즉, 각 컬럼이 하나의 데이터만 저장하고, 여러 값을 가지지 않게 Table을 분리한다.
DBMS에 대한 내용을 담은 topic table이 아래와 같이 있다.
단점 1. DBMS에서 가지고 있는 tag값을 조회하기 어렵다.
단점 2. tag 값 수정시 두개의 값을 수정해줘야하는 번거로움이 있음
단점 3. Order By할 때 정렬에 어려움이 있음
위 사진에서 볼 수 있듯이 tag 컬럼에 여러 data가 들어가 있는 것을 확인했다.
이에 따라 Topic table과 Tag table로 분리하려한다.
제 1 정규화에서 참고했던 자료들이 제2, 제3 정규화에서 다소 오해를 불러일으킬 수 있어
제 2 정규화부터는 다른 자료를 참고하여 글을 썼다.
하나의 테이블에 복합키 결정자가 있을 때, 복합키의 부분집합이 결정자가 되면 안된다. 따라서 복합키의 부분집합 결정자 부분과 종속되는 일반 속성을 다른 하나의 테이블로 분리해주는 과정이다.
쉽게 설명하면, 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업이다.
해당 예시에서 기본키는 (학생번호, 강좌이름)으로 복합키라는 것을 알아두자.
성적은 (학생번호, 강좌이름) 복합키에 종속된다.
(학생번호, 강좌이름) --> (성적)
강의실은 복합키의 부분집합인 (강좌 이름)에 종속된다.
(강좌이름) --> (강의실)
즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.
단점 1. 하나의 테이블에 강좌이름, 강의실 데이터가 중복으로 들어가고 있다.
제2 정규형을 적용 대상인 수강강좌 Table에 제2 정규화를 적용하여 수강, 강의실 2개의 table로 나누었다.
이제 수강 Table 내 복합키 부분집합에 종속되는 일반 속성은 존재하지 않는다.
제2 정규화를 완료한 테이블에서, 이행적 함수 종속성을 제거하는 과정이다.
이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.
쉽게 말하면 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없는 것이다.
테이블에서 학생 번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다. 그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 한다.
강좌이름은 학생번호에 종속된다.
(학생번호) --> (강좌 이름)
수강료는 강좌이름에 종속된다.
(강좌이름) --> (수강료)
단점 1. 501번 학생이 강좌를 자료구조로 변경하고 싶을 때 수강료를 따로 20000원으로 수정해야하는 번거로움이 있음
제 3 정규형 적용 대상인 계절학기 Table에 제3 정규화를 적용하여 계절수강, 수강료 2개의 Table로 나누었다.
이제 계절수강 Table 내 주식별자가 아닌 다른 일반 속성에 종속되는 값은 없다.
ASAC 04 애런: 정규화 정의