이번 문서의 목표: 이 파일을 다 읽으면 함수적 종속을 정의·표기하고 Armstrong 공리로 새로운 종속을 유도하며, 속성 집합의 폐포(closure)를 손으로 계산해 후보키를 찾고, 나쁜 스키마 설계가 왜 삽입·삭제·갱신 이상을 낳는지 실제 데이터로 설명할 수 있게 된다. 16·17편의 정규화는 이 편의 개념을 판별 기준으로 그대로 사용한다.
왜 함수적 종속이 필요한가
06편에서 배운 키(key)는 “이 값만 알면 한 행을 특정할 수 있다”는 개념이었습니다. 함수적 종속(functional dependency, FD)은 이 아이디어를 키뿐 아니라 임의의 속성 집합 사이의 관계로 넓힌 것입니다. “학번을 알면 그 학생의 이름과 학과를 항상 하나로 결정할 수 있다”처럼, 한 속성(또는 속성 집합)의 값이 다른 속성의 값을 유일하게 결정하는 관계를 다룹니다. 이 관계를 정확히 표현할 수 있어야 “이 스키마가 왜 문제인지”, “어떻게 나누어야 문제가 사라지는지”를 논리적으로 증명할 수 있고, 그것이 16·17편의 정규화입니다.
쉽게 말하면: 함수적 종속은 “왼쪽 값을 알면 오른쪽 값이 자동으로 정해진다”는 규칙입니다. 이 규칙들을 모아 놓으면 스키마가 잘 설계되었는지 기계적으로 검사할 수 있습니다.
1. 함수적 종속의 정의와 표기
릴레이션 스키마 에서 속성 집합 에 대해, 의 값이 같은 두 튜플은 항상 의 값도 같을 때 “가 를 함수적으로 결정한다” 또는 “가 에 함수적으로 종속한다”고 하며 로 표기합니다.
- (결정자, determinant): 화살표 왼쪽, 값을 알고 있는 쪽.
- (종속자, dependent): 화살표 오른쪽, 결정되는 쪽.
- (함수적 종속 기호): “왼쪽이 오른쪽을 결정한다”고 읽습니다.
예제로 다음 수강 정보 릴레이션을 씁니다. 실제 값은 아래 표와 같습니다.
수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수)
| 학번 | 이름 | 학과 | 과목코드 | 과목명 | 담당교수 |
|---|---|---|---|---|---|
| S1 | 김민준 | 컴퓨터공학 | C001 | 데이터베이스 | 이교수 |
| S1 | 김민준 | 컴퓨터공학 | C002 | 운영체제 | 박교수 |
| S2 | 이서연 | 컴퓨터공학 | C001 | 데이터베이스 | 이교수 |
| S3 | 박도윤 | 전자공학 | C001 | 데이터베이스 | 이교수 |
| S3 | 박도윤 | 전자공학 | C003 | 네트워크 | 최교수 |
| S4 | 최지우 | 컴퓨터공학 | C002 | 운영체제 | 박교수 |
이 데이터에서 관찰되는 함수적 종속을 적어 보면 다음과 같습니다.
- 첫 번째 식:
학번이S1인 두 행 모두이름이 “김민준”입니다. 학번이 같으면 이름도 항상 같습니다. - 세 번째 식:
과목코드가C001인 세 행 모두과목명이 “데이터베이스”입니다.
반면 (학번, 과목코드) 전체는 남은 모든 속성(이름, 학과, 과목명, 담당교수)을 함수적으로 결정하며, 표에서 두 컬럼 값이 같은 행이 하나도 없으므로 이 조합이 이 릴레이션의 후보키(candidate key) 역할을 합니다.
쉽게 말하면: 함수적 종속은 “이 값들을 알면 저 값은 자동으로 알 수 있다”는 데이터의 규칙이고, 후보키는 “이 값들만 알면 릴레이션의 나머지 전부를 알 수 있는” 가장 작은 종속자 집합입니다.
자주 틀리는 점: 함수적 종속은 현재 저장된 데이터가 우연히 만족하는 관계가 아니라, 그 도메인(업무 규칙)상 항상 성립해야 하는 제약입니다. 예를 들어 위 표에서 우연히 이름이 모두 다르다고 해서 이름 → 학번이 성립한다고 주장할 수는 없습니다(동명이인이 생기면 깨지는 규칙이므로 업무 규칙으로 보장되지 않습니다). 함수적 종속은 데이터가 아니라 스키마 설계자가 선언하는 업무 규칙입니다.
2. Armstrong의 공리 — 새로운 종속을 유도하는 규칙
Armstrong의 공리(Armstrong’s axioms)는 주어진 함수적 종속 집합 로부터 논리적으로 반드시 성립하는 다른 함수적 종속을 유도하는 기본 규칙 3가지입니다. (는 속성 집합)
| 공리 | 규칙 | 의미 |
|---|---|---|
| 반사율(reflexivity) | 이면 | 부분집합은 항상 자기 자신(또는 그 부분)을 결정한다(자명한 종속) |
| 증가율(augmentation) | 이면 | 양쪽에 같은 속성을 더해도 종속 관계는 유지된다 |
| 이행률(transitivity) | 이고 이면 | 종속은 사슬처럼 이어진다 |
이 세 규칙만으로 에 속한 모든 논리적 귀결을 유도할 수 있다는 것이 증명되어 있어(완전성, completeness), 실무에서는 아래 3가지 파생 규칙(derived rule)을 함께 씁니다. 파생 규칙은 위 3개 공리로부터 다시 유도할 수 있는 규칙입니다.
| 파생 규칙 | 규칙 | 예시 |
|---|---|---|
| 합집합률(union) | 이고 이면 | 학번→이름, 학번→학과 이면 학번→이름학과 |
| 분해율(decomposition) | 이면 이고 | 학번→이름학과 이면 학번→이름, 학번→학과 |
| 의사이행률(pseudotransitivity) | 이고 이면 | 과목코드→담당교수, 담당교수 연구실→예산 이면 과목코드 연구실→예산 |
예제 데이터에 합집합률을 적용해 보면, 과 로부터
를 바로 유도할 수 있습니다. 이렇게 유도 가능한 함수적 종속을 모두 모은 집합을 의 논리적 귀결 전체라고 하며 로 표기합니다.
3. 속성 폐포 — 후보키를 찾는 계산 절차
속성 폐포(attribute closure)는 어떤 속성 집합 에서 함수적 종속 집합 를 반복 적용해 결정할 수 있는 모든 속성을 모은 집합이며 로 표기합니다. 이 계산이 중요한 이유는, 가 릴레이션 스키마의 전체 속성과 같아지면 가 슈퍼키(super key)라는 뜻이기 때문입니다.
계산 절차(알고리즘):
- (자기 자신에서 시작)
- 에 속한 각 종속 에 대해, 이면
- 2단계에서 가 더 이상 커지지 않을 때까지 반복
- 최종 가
예제의 함수적 종속 집합은 다음과 같습니다.
의 폐포 를 단계별로 계산합니다.
| 단계 | result | 적용한 FD | 새로 추가된 속성 |
|---|---|---|---|
| 초기 | {학번, 과목코드} | - | - |
| 1 | {학번, 과목코드, 이름} | 학번 → 이름 | 이름 |
| 2 | {학번, 과목코드, 이름, 학과} | 학번 → 학과 | 학과 |
| 3 | {학번, 과목코드, 이름, 학과, 과목명} | 과목코드 → 과목명 | 과목명 |
| 4 | {학번, 과목코드, 이름, 학과, 과목명, 담당교수} | 과목코드 → 담당교수 | 담당교수 |
| 5 | 더 적용할 FD 없음 | - | 종료 |
최종 로, 수강정보 릴레이션의 전체 속성과 같습니다. 따라서 는 슈퍼키이며, 이보다 더 작은 부분집합(예: {학번} 하나만)으로는 전체 속성을 결정할 수 없으므로(예: 학번만으로는 과목명을 알 수 없습니다) 이 집합은 후보키입니다.
자주 틀리는 점: 폐포 계산에서 “더 이상 새로 추가되는 속성이 없을 때”가 종료 조건입니다. 한 번의 순회에서 FD를 하나 적용해 보고 바로 멈추면 안 되며, result 전체가 한 바퀴 동안 변하지 않을 때까지 모든 FD를 반복 검사해야 합니다. 순서를 바꿔 가며 여러 번 시도해도 최종 는 항상 같은 집합으로 수렴합니다.
4. 최소 커버 — 군더더기 없는 FD 집합
같은 논리적 귀결 를 만들어 내는 함수적 종속 집합은 여러 형태로 쓸 수 있습니다. 그중 불필요한 속성이나 중복된 종속이 전혀 없는 가장 간결한 형태를 최소 커버(minimal cover, 정준 커버·canonical cover라고도 함)라 합니다. 정규화 알고리즘(16·17편)은 원래의 가 아니라 최소 커버를 입력으로 사용해야 불필요한 분해를 피할 수 있습니다.
최소 커버를 구하는 절차:
- 오른쪽을 단일 속성으로 분해한다. 분해율을 이용해 모든 FD의 오른쪽을 속성 하나짜리로 만든다. (예: 는 과 로 나눈다.)
- 왼쪽의 불필요한 속성(extraneous attribute)을 제거한다. 각 FD의 왼쪽에서 속성을 하나씩 빼 보고, 빼도 폐포 계산 결과가 똑같이 나오면 그 속성은 불필요하므로 제거한다.
- 중복된 FD를 제거한다. 어떤 FD를 통째로 제거해도 나머지 FD들의 폐포로 그 FD가 그대로 유도되면, 그 FD는 중복이므로 제거한다.
예를 들어 가 주어졌다고 하겠습니다. 세 번째 식 의 왼쪽에서 학번이 불필요한지 검사합니다. 학번을 뺀 의 폐포를 계산하면 이고, 여기에 이미 담당교수가 포함되어 있으므로 학번은 불필요한 속성입니다. 따라서 세 번째 식은 로 줄일 수 있고, 이는 네 번째 식과 완전히 같으므로 중복 제거 단계에서 하나로 합쳐집니다. 최종 최소 커버는 입니다.
5. 이상 현상 — 나쁜 스키마가 만드는 문제
이상 현상(anomaly)은 여러 개념이 하나의 릴레이션에 억지로 뒤섞여 있을 때, 데이터를 조작(삽입·삭제·수정)하는 과정에서 발생하는 논리적 문제입니다. 위 수강정보 릴레이션은 “학생 정보”와 “과목 정보”라는 서로 다른 개념을 한 테이블에 함께 담고 있어 세 가지 이상 현상이 모두 나타납니다.
삽입 이상(insertion anomaly)
쉽게 말하면: 관련 없는 정보가 없으면 알고 싶은 정보조차 넣을 수 없는 문제입니다.
새로 개설된 과목 C004(인공지능, 담당교수 정교수)를 등록하고 싶지만, 이 릴레이션의 기본키는 (학번, 과목코드)이므로 아직 그 과목을 신청한 학생이 한 명도 없으면 학번 자리를 채울 수 없어 행 자체를 넣을 수 없습니다. 과목 정보만 독립적으로 추가하고 싶어도 학생 신청이라는 무관한 사건을 기다려야 합니다.
삭제 이상(deletion anomaly)
쉽게 말하면: 원하지 않는 정보까지 함께 사라지는 문제입니다.
S3(박도윤)가 C003(네트워크) 수강을 취소해서 그 행을 삭제한다고 하겠습니다. 표를 보면 C003을 신청한 사람은 박도윤뿐이므로, 이 행을 지우는 순간 “C003의 과목명은 네트워크이고 담당교수는 최교수”라는 과목 자체의 정보까지 데이터베이스에서 통째로 사라집니다. 학생 하나의 수강 취소가 과목 정보 소실로 이어지는 것은 명백한 설계 결함입니다.
갱신 이상(update anomaly)
쉽게 말하면: 같은 사실이 여러 곳에 중복 저장되어, 하나만 고치면 나머지와 모순이 생기는 문제입니다.
C001(데이터베이스)의 담당교수가 이교수에서 김교수로 바뀌었다고 하겠습니다. 표에서 C001을 수강하는 행은 (S1,C001), (S2,C001), (S3,C001) 세 개이므로, 담당교수 정보를 세 행 모두에서 각각 고쳐야 합니다. 만약 실수로 한두 행만 고친다면, 같은 과목인데 행마다 담당교수가 다르게 저장되는 모순된 상태(inconsistency)가 발생합니다.
자주 틀리는 점: 세 이상 현상을 이름만 외우고 혼동하는 경우가 많습니다. “정보를 못 넣는다”는 삽입, “지우면 다른 정보까지 없어진다”는 삭제, “여러 곳을 다 고쳐야 하고 안 그러면 모순이 생긴다”는 갱신으로 구분해 기억하는 것이 좋습니다. 세 현상 모두 근본 원인은 같습니다 — 서로 독립적인 두 개념(학생 정보, 과목 정보)이 하나의 릴레이션에 억지로 합쳐져 있어서 발생합니다.
6. 완전 함수적 종속과 부분 함수적 종속
정규화(16편)에서 바로 쓰이는 개념을 미리 정의해 둡니다. 기본키가 여러 속성으로 이루어진 복합키(composite key)일 때 유용한 구분입니다.
- 완전 함수적 종속(full functional dependency): 가 전체에는 종속하지만, 의 어떤 진부분집합(proper subset)에도 종속하지 않는 경우.
- 부분 함수적 종속(partial functional dependency): 가 의 진부분집합만으로도 결정되는 경우.
예제에서 기본키는 입니다. 이름은 학번(진부분집합) 하나만으로 결정되므로, {학번, 과목코드} → 이름은 부분 함수적 종속입니다. 반면 만약 수강일수라는 속성이 있고 그 값이 특정 학생이 특정 과목을 들은 기간에 따라서만 정해진다면(학번 하나만으로도, 과목코드 하나만으로도 알 수 없다면) {학번, 과목코드} → 수강일수는 완전 함수적 종속입니다.
쉽게 말하면: 완전 함수적 종속은 “열쇠 전체가 다 있어야 열리는 자물쇠”, 부분 함수적 종속은 “열쇠 중 일부만 있어도 열리는 자물쇠”입니다.
좋은 스키마 설계를 향한 직관
지금까지 살펴본 개념을 정리하면, “좋은 스키마”란 함수적 종속의 결정자가 모두 그 릴레이션의 (후보)키가 되도록 설계된 스키마입니다. 수강정보 릴레이션의 문제는 과목코드 → 과목명, 과목코드 → 담당교수처럼 키가 아닌 속성이 결정자 역할을 하고 있다는 점입니다. 이 관찰이 바로 16편에서 배울 BCNF(Boyce-Codd 정규형)의 핵심 판별 기준이며, 수강정보를 학생 정보 릴레이션과 과목 정보 릴레이션으로 나누는 것이 16편의 분해 절차입니다.
핵심 정리
- 함수적 종속 는 ” 값이 같으면 값도 항상 같다”는 업무 규칙이며, 데이터가 우연히 만족하는 관계가 아니라 도메인이 보장해야 하는 제약이다.
- Armstrong의 공리(반사율·증가율·이행률)와 파생 규칙(합집합률·분해율·의사이행률)으로 주어진 에서 새로운 함수적 종속을 논리적으로 유도할 수 있다.
- 속성 폐포 는 로부터 결정 가능한 모든 속성의 집합이며, 가 릴레이션 전체 속성과 같으면 는 슈퍼키, 더 줄일 수 없으면 후보키다.
- 최소 커버는 오른쪽 단일화 → 왼쪽 불필요 속성 제거 → 중복 FD 제거 절차로 얻는, 군더더기 없는 함수적 종속 집합이다.
- 삽입 이상(넣을 수 없음)·삭제 이상(지우면 다른 정보도 사라짐)·갱신 이상(여러 곳을 고쳐야 하고 안 그러면 모순)은 서로 독립적인 개념이 한 릴레이션에 뒤섞여 있을 때 발생하며, 정규화의 존재 이유가 된다.