1. 이상현상(Anomly)
모델링된 데이터베이스의 테이블과 관계들은 데이터를 수정,삭제,입력 하는 과정에서 의도치 않게 일관성이 깨질 수 있는데 이를 이상현상이라고 합니다. 이상현상을 방지하기 위해 데이터 중복을 최소화하면서 테이블을 보다 잘 조직된 상태로 분해하는 과정이 바로 정규화 입니다.
이상현상의 개념
- 삭제 이상: 테이블의 특정 데이터를 삭제할 때 의도하지 않은 정보까지 삭제되는 현상
- 삽입 이상: 테이블에 데이터를 삽일할 때 의도하지 않은 정보까지 삽입해야 하는 현상
- 수정 이상: 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상
예를 들어보겠습니다. 다음과 같은 테이블이 있습니다.
학번 | 학생 이름 | 강의명 | 교수 이름 | 강의실 |
1001 | 김철수 | 데이터베이스 | 이교수 | 101호 |
1001 | 김철수 | 운영체제 | 박교수 | 102호 |
1002 | 이영희 | 데이터베이스 | 이교수 | 101호 |
박민수라는 새로운 학생을 등록 할려고 합니다. 하지만 이 학생이 수강신청을 하지 않았다면 박민수라는 학생을 테이블에 추가 할 수 없습니다. 또한 이교수를 김교수로 수정을 했습니다. 이때 1번째 행과 3번째 행의 이교수중 첫번째 행의 이교수만 수정하여 데이터가 일관되지 않게 저장될 수도 있습니다. 김철수 학생의 데이터를 삭제했는데 운영체제 강의정보 자체가 사라질 수도 있습니다. 이렇게 데이터를 조작하는 과정에서 이상현상이 일어날 수 있습니다. 이런 문제를 해결하기 위해 정규화를 하게 됩니다.
2. 정규화
제 1 정규화
모든 속성이 하나의 속성값만을 가지고 있으면서 유사한 속성이 반복되지 않는 상태를 제 1정규형이라고 하며 제 1정규형으로 만드는 것을 제1정규화 라고 합니다. 하나의 속성이 여러 속성값을 가질 때나 하나의 테이블에 유사한 속성이 반복될 때 이를 별도의 테이블로 분리합니다. 제 1정규형을 만족할 때 속성의 원자성(Atomicity)가 확보되었다고 말합니다.
학번 | 학생 이름 | 강의명 | 교수 이름 | 강의실 |
1001 | 김철수 | 데이터베이스,운영체제 | 이교수,박교수 | 101호,102호 |
1002 | 이영희 | 데이터베이스 | 이교수 | 101호 |
예를 들어 위에 테이블이 있다고 가정해보겠습니다. 하나의 속성이 여러개의 속성값을 가지게 되면서 다음과 같은 문제들이 발생할 수 있습니다.
- 한 속성이 여러개의 속성값을 가지게 되면서 데이터검색이 어려워집니다.
- 강사나 강의실 정보를 수정하려면 여러개의 값을 수정해야 합니다.
- 강의를 삭제하면 학생 정보까지 날아갈 위험이 있습니다.
따라서 제1정규화를 통해서 다음과 같은 문제를 해결해야 합니다.
학번 | 학생 이름 | 강의명 | 교수 이름 | 강의실 |
1001 | 김철수 | 데이터베이스 | 이교수 | 101호 |
1001 | 김철수 | 운영체제 | 박교수 | 102호 |
1002 | 이영희 | 데이터베이스 | 이교수 | 101호 |
제 2 정규화
주식별자가 두 개 이상으로 구성된 복합식별자인 경우 일반 속성이 주식별자의 일부에만 종속성을 가질 때가 있는데 이를 부분 함수종속성이라고 합니다. 제2정규형은 이런 부분함수종속성을 제거한 상태이며 제 2정규형을 만드는 것을 제2정규화라고 합니다. 주식별자에 완전하게 종속적이지 않은 속성을 별도의 테이블로 분리합니다.
예를 들어보겠습니다. 위에 테이블을 보면 학번으로도 학생이름이 결정됩니다. 여기서 학번이 결정자 학생이름을 종속자라고 합니다. 학번으로 학생이름을 결정 할 수도 있지만 기본키가 아닌 일반속성인 강의명이 교수이름과 강의실을 결정할 게 됩니다. 따라서 키가 아닌 속성들이 기본키(학번) 전체에 종속되도록 테이블을 분리해야 합니다.
학생테이블
학번 | 학생 이름 |
1001 | 김철수 |
1002 | 이영희 |
강의 테이블
강의명 | 교수 이름 | 강의실 |
데이터베이스 | 이교수 | 101호 |
운영체제 | 박교수 | 102호 |
데이터베이스 | 이교수 | 101호 |
수강 테이블(학생과 강의를 연결하는 테이블)
학번 | 강의명 |
1001 | 데이터베이스 |
1001 | 운영체제 |
1002 | 데이터베이스 |
이렇게 제 2정규화를 하게 되면 이제 강의정보를 수정 할 때 한 곳에서만 변경하면 강의정보를 수정할 수 있고 더 이상 강사나 강의실 정보가 중복되지 않습니다.
제 3 정규화
주 식별자가 아닌 일반 속성 간에 함수종속성이 존재할 때 이를 이행 함수종속성이라고 합니다.
함수종속성이란 A→B이고 B→C 이면 A→C가 성립하는 것이다. PK 속성 A와 일반 속성 B,C가 있을 때 B→C 의 함수 종속성이 존재하면 C는 A에 대해 이행 함수종속성을 가진다고 말합니다.
예시를 들어보겠습니다. 아래 학생정보와 관련된 엔티티가 있습니다.
학번 | 지도교수 | 학과 |
101 | 강철민 | 전산과학과 |
102 | 이기철 | 경영학과 |
103 | 오진호 | 전산과학과 |
104 | 이기철 | 경영학과 |
위 엔티티의 함수 종속성을 표현하면 다음과 같습니다. 학번 →지도교수, 학과 지도교수 → 학과
일반 속성 내에서의 함수 종속이 존재하는 이행 함수종속성이 존재하므로 3차 정규화를 수행하여 엔티티를 분리합니다.
학번(PK) | 지도교수 |
101 | 강철민 |
102 | 이기철 |
103 | 오진호 |
104 | 이기철 |
지도교수(PK) | 학과 |
강철민 | 전산과학과 |
이기철 | 경영학과 |
오진호 | 전산과학과 |
이기철 | 경영학과 |
3차 정규화의 수행결과 분리된 엔티티들은 서로 비식별자 관계가 됩니다.
BCNF
3차 정규화를 만족해도 여전히 이상현상(삽입,삭제,갱신 이상)이 발생할 수 있습니다. 기본키가 아닌 속성이 다른 속성을 결정하는 문제는 3NF에서 해결되었지만 기본키가 아닌 후보 키가 결정자가 될 경우 문제가 발생할 수 있습니다. 그래서 모든 결정자가 후보 키가 되도록 강제시켜 이 문제를 해결할려고 했고 그렇게 나온 것이 BCNF입니다. BCNF는 3차 정규화를 강화한 형태로 기본 키 후보 중 일부만 결정자가 되는 부분 후보 키 종속성을 해결하기 위해 사용이 됩니다.
예를 들어보겠습니다. 다음과 같은 테이블이 있습니다.
학번 | 강의명 | 교수 이름 |
1001 | 데이터베이스 | 이교수 |
1001 | 운영체제 | 박교수 |
1002 | 데이터베이스 | 이교수 |
기본키는 학번과 강의명이 복합키로 설정되어있고 강의명 이 교수명의 결정자가 됩니다. 하지만 강의명은 후보 키가 아니기 때문에 기본 키가 아닌 속성인 강의명이 결정자가 되는 문제가 발생합니다. 이걸 해결하기 위해 BCNF를 적용합니다.
강의 테이블
강의명 | 교수 이름 |
데이터베이스 | 이교수 |
운영체제 | 박교수 |
데이터베이스 | 이교수 |
수강 테이블
학번 | 강의명 |
1001 | 데이터베이스 |
1001 | 운영체제 |
1002 | 데이터베이스 |
이제 강의명이 결정자이면서 후보키가 되므로 BCNF를 만족하게 됩니다.
'개발자 취업준비' 카테고리의 다른 글
데이터 모델링(Data Modeling)과 ERD (0) | 2025.02.25 |
---|