- 정보의 중복
각 사원이 속한 부서 수만큼 동일한 사원의 튜플들이 존재하므로 사원이름, 사원번호, 주소, 전화번호 등이 중복되어 저장 공간이 낭비됨- 수정 이상
만일 어떤 부서의 이름이 바뀔 때 이 부서에 근무하는 일부 사원 튜플에서만 부서이름을 변경하면 데이터베이스가 불일치 상태에 빠짐- 삽입 이상: 불필요한 데이터 함께 입력 않고는 정보 입력 불가
만일 어떤 부서를 신설했는데 아직 사원을 한 명도 배정하지 않았다면 이 부서에 관한 정보를 입력할 수 없음- 삭제 이상: 데이터 손실 발생 가능
만일 어떤 부서에 속한 사원이 단 한 명이 있는데, 이 사원에 관한 투플을 삭제하면 이 사원이 속한 부서에 관한 정보도 릴레이션에서 삭제됨
릴레이션 분해: 하나의 일레이션을 두 개 이상의 릴레이션으로 나누는 것
- 필요한 경우에는 분해된 릴레이션들로부터 원래의 릴레이션을 다시 구할 수 있을 보장
- 분해 잘못할 경우 두 릴레이션으로부터 얻을 수 있는 정보가 원래의 릴레이션이 나타내는 정보보다 적을 수도 많을 수도 있음
- 함수적 종속성을 기반으로 분해
부서 이름 수정: 수정 이상 X
새로운 부서 삽입: 삽입 이상 X
마지막 사원 튜플 삭제: 삭제 이상 X
정규형
: 제1정규형, 제2정규형, 제3정규형, BCNF, 제4정규형, 제5정규형
일반적으로 BCNF까지만 고려
관계데이터베이스 설계 비공식적 지침
* 릴레이션 스키마에 관한 주장
결정자 (determinant)
: 주어진 릴레이션에서 다른 애트리뷰트(또는 집합)를 고유하게 결정하는 하나 이상의 애트리뷰트
A → B : A가 B를 결정한다. (A는 B의 결정자이다.)
사원번호 → 사원이름, 사원번호 → 주소, 사원번호 → 전화번호, 부서번호 → 부서이름 / 직책 → 사원번호 X (여러 사원이 팀장이 될 수 있음)
함수적 종속성
A → B : B가 A에 함수적으로 종속한다.
(충분 조건: 각 A값에 대해 반드시 한 개의 B값이 대응)
사원번호: 사원이름, 주소, 전화번호의 결정자
=> 사원이름, 주소, 전화번호: 사원번호에 함수적 종속
직책: (사원번호, 부서번호)에 함수적 종속. 사원번호에 함수적 종속 X.
=> (사원번호, 부서번호)가 직책을 결정하는 결정자이고, 사원번호는 직책을 결정하는 결정자가 아니다.
(사원번호, 부서번호) → 직책 : 완전 함수적 종속성
(사원번호, 부서번호) → 사원이름, 주소, 전화번호, 부서이름 : 부분 함수적 종속성
(학번, 과목번호) → 학점
학번(A) → 학과이름(B), 학과전화번호(C)
학과이름 → 학과전화번호
: 하나의 릴레이션을 두 개 이상의 릴레이션으로 나누는 것
(+) 중복 감소, 갱신 이상 감소
(-) 조인이 필요 없는 질의 -> 조인을 필요로 하는 질의, 분해된 릴레이션들로 원래 릴레이션 재구성 불가
학번, 이름 / 학번, 이메일 => 불필요한 분해. 학번만 두 번 정의
학번, 과목번호 / 학번, 학점 => 나쁜 분해. 과목번호와 학점 연관성 안 보임. 재조인 시, 기존 릴레이션에 존재하지 않던 튜플들이 생성됨
: 모든 애트리뷰트가 원자값만을 가짐. 반복 그룹 X
* 반복 그룹: 한 개의 기본키 값에 대해 두 개 이상의 값을 가질 수 있는 애트리뷰트
학생 릴레이션: 모든 애트리뷰트 원자값 가짐 => 제1정규형 만족. 기본 키(학번, 과목번호)
- 갱신 이상 생기는 이유?
기본 키에 대한 부분 함수적 종속성 존재.
(학번, 과목번호) → 학과이름, 학과전화번호
(학번, 과목번호) → 학점
=> 학번, 학과이름, 학과전화번호 / 학번, 과목번호, 학점
위와 같은 방식으로 분해 시, 부분 함수적 종속성 존재 X & 제2정규형 만족
: 제1정규형 만족 + 어떤 후보 키에도 속하지 않는 모든 애트리뷰트들이 릴레이션 R의 기본 키에 완전하게 함수적으로 종속
제1정규형의 기본 키가 두 개 이상의 애트리뷰트로 구성되었을 경우에만 고려.
학생 릴레이션: 기본 키(학번). 제2정규형 만족.
- 갱신 이상 발생 이유?
이행적 종속성 존재
학과전화번호: 학번에 이행적 종속.
학번 → 학과이름
학과이름 → 학과전화번호
=> 학번 → 학과전화번호
학번, 학과이름 / 학과이름, 학과전화번호
위와 같은 방식으로 분해 시, 이행적 종속성 존재 X & 제3정규형 만족
: 제2정규형 만족 + 모든 애트리뷰트가 릴레이션 R의 기본 키에 이행적으로 종속 X
수강 릴레이션: 각 학생은 여러 과목 수강 가능, 각 강사는 한 과목만 가르침. 기본 키(학번, 과목).
키가 아닌 강사 애트리뷰트가 기본 키에 완전하게 함수적 종속 => 제2정규형 만족
기본 키에 직접 종속 => 제3정규형 만족
함수적 종속성: (학번, 과목) → 강사 , 강사 → 과목
- 갱신 이상 발생 이유?
키가 아닌 애트리뷰트가 다른 애트리뷰트 결정
릴레이션 후보 키(학번, 과목), (학번, 강사)
: 제3정규형 만족 + 모든 결정자가 후보 키
ex) 수강 릴레이션에서 강사 애트리뷰트는 후보 키가 아님에도 불구하고 과목 애트리뷰트를 결정 => BCNF X
제3정규형 만족하는 대부분 릴레이션: BCNF도 만족
(하나의 후보 키만을 가진 릴레이션이 제3정규형 만족 시, BCNF도 동시에 만족)
분해 ⬆️, 조인 필요성 ⬆️
학생(학번, 학과이름, 학과전화번호)
제2정규형 만족. 조인 필요 XSELECT 학과이름, 학과전화번호 FROM 학생 WHERE 학번 = '11002';
학생(학번, 학과이름) / 학과(학과이름, 학과전화번호)
SELECT 학과이름, 학과전화번호 FROM 학생, 학과 WHERE 학번 = '11002' AND 학생.학과이름 = 학과.학과이름;
검색질의 >> 갱신질의 사용