관계형 데이터베이스의 함수적 종속성과 정규화
이 글은 Pearson의 Fundamentals of Database Systems 7판을 읽고 작성했습니다.
릴레이션 스키마를 설계하는 몇 가지 개략적인 지침
지침 1. 의미가 쉽게 전달되도록 릴레이션 스키마를 설계한다.
여러 개의 엔티티 타입과 관계 타입의 애트리뷰트들을 섞어서 하나의 릴레이션으로 구성하면 안 된다.
지침 2. 릴레이션에서 삽입, 삭제, 또는 수정 이상이 생기지 않도록 기본 릴레이션 스키마를 설계한다.
예를 들어, 특정 부서에 대한 정보를 해당 부서에 속하는 모든 사원 정보에 중복하여 저장한다고 가정하자. 이렇게 기본 릴레이션을 자연 조인 저장할 경우 갱신 이상을 초래한다.
삽입 이상: 사원 데이터를 추가할 때마다 부서에 대한 모든 정보를 정확하게 삽입해야 한다.
- 사원이 없으면 모든 사원 애트리뷰트를 널로 설정한 튜플을 생성해야 한다. 하지만 Ssn이 기본키이기 때문에 개체 무결성을 위반하게 된다. 첫 사원이 배정되고 나면 해당 튜플은 불필요하다.
삭제 이상: 유일한 사원의 정보를 삭제하면 부서 정보도 삭제된다.
수정 이상: 부서 정보 수정을 하려면 해당 부서의 모든 사원에 대해 갱신 연산을 해야 한다.
하지만 어떤 질의들은 효율적으로 수행하기 위해 따르지 않을 수도 있다. 이런 경우 트리거나 자동 변경을 수행하는 저장된 프로시저를 이용하여 일관성을 유지하면 된다.
지침 3. 널 값을 자주 가질 수 있는 애트리뷰트를 가능한 한 기본 릴레이션의 애트리뷰트로 포함하지 않는다.
저장 공간 낭비
선택이나 조인 시 비교 연산의 결과를 예측하기 어려움
COUNT, SUM과 같은 집단 함수에서 따로 처리 필요
여러 가지 의미로 해석 가능(없다? 모른다? 적용되지 않는다?
예를 들어, 사원 중 15%만 사무실을 가진다고 하자. office_number라는 애트리뷰트를 사원 테이블에 포함시키지 않고, EMP_OFFICES라는 새로운 릴레이션을 추가하여 사무실을 가진 사원에 대해서만 튜플을 삽입한다.
지침 4. 가짜 튜플들이 생성되지 않도록 하기 위해서, 적절하게 관련된(기본키, 왜래키) 애트리뷰트를 가지고 동등 조건으로 조인할 수 있는 릴레이션 스키마를 설계한다.
두 릴레이션을 자연 조인하여 원래의 정확한 정보를 얻을 수 없는 경우(유효하지 않은 튜플이 생성되는 경우)를 말한다.
요약
추가적인 분석 도구 없이 발견할 수 있는 문제들은 다음과 같다.
릴레이션에 갱신 이상의 원인이 됨
- 삽입/수정 시 중복 작업, 삭제 시 예상치 못한 정보의 궁극적인 손실
널로 인한 저장 공간의 낭비와 선택, 집계 연산 및 조인 수행의 어려움
타당한(외래키, 기본키) 관계를 갖지 않는 애트리뷰트들로 조인 시 가짜 튜플 생성
함수적 종속성
릴레이션 스키마 분석을 위한 정형적 도구로, 정규형을 정의하는 데 사용한다.
가정: 관계 데이터베이스 스키마가 n개의 애트리뷰트 A1, A2, ..., An으로 구성되어 있다. 전체 데이터베이스는 하나의 전체 릴레이션 스키마(universal relation schema) R = { A1, A2, ..., An }으로 설명할 수 있다.
정의: R의 애트리뷰트들의 부분집합인 X와 Y 사이의 함수적 종속성은 릴레이션 스키마 R의 릴레이션 상태 r을 구성할 수 있는 가능한 튜플들에 대한 제약 조건을 지정하는 것이다. 여기서 제약 조건은 r의 임의의 두 튜플 t1, t2에 대해서 t1[X] = t2[X]
이면 반드시 t1[Y] = t2[Y]
이어야 한다는 것이다.
→ 임의의 튜플 Y 부분의 값은 X 부분의 값에 의해 결정되거나 종속된다.
→ 임의의 튜플의 X 부분의 값이 Y 부분의 값을 고유하게(또는 함수적으로) 결정한다.
⇒ X에서 Y로 함수적 종속성 존재 === Y가 X에 함수적으로 종속됨
R의 애트리뷰트들의 두 집합의 의미에 함수적 종속성이 존재한다면 종속성을 제약 조건으로 명시한다.
ex)
사원의 사회보장번호(
Ssn
)는 사원의 이름(Ename
)을 유일하게 결정한다.프로젝트 번호(
Pnumber
)는 프로젝트 이름(Pname
)과 위치(Plocation
)을 결정Ssn
과Pnumber
가 사원이 프로젝트에서 현재 주당 일하는 시간을 결정
→ Ename
이 Ssn
에 의해 함수적으로 결정되었음을 알 수 있다.
⇒ Ssn
값이 주어지면 Ename
값을 알 수 있다.