Skip to Content
독학사독학사 4단계데이터베이스13. 함수적 종속과 이상 현상 이해하기

이번 문서의 목표: 이 파일을 다 읽으면 함수적 종속을 정의·표기하고 Armstrong 공리로 새로운 종속을 유도하며, 속성 집합의 폐포(closure)를 손으로 계산해 후보키를 찾고, 나쁜 스키마 설계가 왜 삽입·삭제·갱신 이상을 낳는지 실제 데이터로 설명할 수 있게 된다. 16·17편의 정규화는 이 편의 개념을 판별 기준으로 그대로 사용한다.

왜 함수적 종속이 필요한가

06편에서 배운 키(key)는 “이 값만 알면 한 행을 특정할 수 있다”는 개념이었습니다. 함수적 종속(functional dependency, FD)은 이 아이디어를 키뿐 아니라 임의의 속성 집합 사이의 관계로 넓힌 것입니다. “학번을 알면 그 학생의 이름과 학과를 항상 하나로 결정할 수 있다”처럼, 한 속성(또는 속성 집합)의 값이 다른 속성의 값을 유일하게 결정하는 관계를 다룹니다. 이 관계를 정확히 표현할 수 있어야 “이 스키마가 왜 문제인지”, “어떻게 나누어야 문제가 사라지는지”를 논리적으로 증명할 수 있고, 그것이 16·17편의 정규화입니다.

쉽게 말하면: 함수적 종속은 “왼쪽 값을 알면 오른쪽 값이 자동으로 정해진다”는 규칙입니다. 이 규칙들을 모아 놓으면 스키마가 잘 설계되었는지 기계적으로 검사할 수 있습니다.

1. 함수적 종속의 정의와 표기

릴레이션 스키마 RR에서 속성 집합 X,YRX, Y \subseteq R에 대해, XX의 값이 같은 두 튜플은 항상 YY의 값도 같을 때 “XXYY를 함수적으로 결정한다” 또는 “YYXX에 함수적으로 종속한다”고 하며 XYX \rightarrow Y로 표기합니다.

  • XX (결정자, determinant): 화살표 왼쪽, 값을 알고 있는 쪽.
  • YY (종속자, dependent): 화살표 오른쪽, 결정되는 쪽.
  • \rightarrow (함수적 종속 기호): “왼쪽이 오른쪽을 결정한다”고 읽습니다.

예제로 다음 수강 정보 릴레이션을 씁니다. 실제 값은 아래 표와 같습니다.

수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수)

학번이름학과과목코드과목명담당교수
S1김민준컴퓨터공학C001데이터베이스이교수
S1김민준컴퓨터공학C002운영체제박교수
S2이서연컴퓨터공학C001데이터베이스이교수
S3박도윤전자공학C001데이터베이스이교수
S3박도윤전자공학C003네트워크최교수
S4최지우컴퓨터공학C002운영체제박교수

이 데이터에서 관찰되는 함수적 종속을 적어 보면 다음과 같습니다.

학번이름\text{학번} \rightarrow \text{이름} 학번학과\text{학번} \rightarrow \text{학과} 과목코드과목명\text{과목코드} \rightarrow \text{과목명} 과목코드담당교수\text{과목코드} \rightarrow \text{담당교수}
  • 첫 번째 식: 학번S1인 두 행 모두 이름이 “김민준”입니다. 학번이 같으면 이름도 항상 같습니다.
  • 세 번째 식: 과목코드C001인 세 행 모두 과목명이 “데이터베이스”입니다.

반면 (학번, 과목코드) 전체는 남은 모든 속성(이름, 학과, 과목명, 담당교수)을 함수적으로 결정하며, 표에서 두 컬럼 값이 같은 행이 하나도 없으므로 이 조합이 이 릴레이션의 후보키(candidate key) 역할을 합니다.

쉽게 말하면: 함수적 종속은 “이 값들을 알면 저 값은 자동으로 알 수 있다”는 데이터의 규칙이고, 후보키는 “이 값들만 알면 릴레이션의 나머지 전부를 알 수 있는” 가장 작은 종속자 집합입니다.

자주 틀리는 점: 함수적 종속은 현재 저장된 데이터가 우연히 만족하는 관계가 아니라, 그 도메인(업무 규칙)상 항상 성립해야 하는 제약입니다. 예를 들어 위 표에서 우연히 이름이 모두 다르다고 해서 이름 → 학번이 성립한다고 주장할 수는 없습니다(동명이인이 생기면 깨지는 규칙이므로 업무 규칙으로 보장되지 않습니다). 함수적 종속은 데이터가 아니라 스키마 설계자가 선언하는 업무 규칙입니다.

2. Armstrong의 공리 — 새로운 종속을 유도하는 규칙

Armstrong의 공리(Armstrong’s axioms)는 주어진 함수적 종속 집합 FF로부터 논리적으로 반드시 성립하는 다른 함수적 종속을 유도하는 기본 규칙 3가지입니다. (X,Y,ZX, Y, Z는 속성 집합)

공리규칙의미
반사율(reflexivity)YXY \subseteq X이면 XYX \rightarrow Y부분집합은 항상 자기 자신(또는 그 부분)을 결정한다(자명한 종속)
증가율(augmentation)XYX \rightarrow Y이면 XZYZXZ \rightarrow YZ양쪽에 같은 속성을 더해도 종속 관계는 유지된다
이행률(transitivity)XYX \rightarrow Y이고 YZY \rightarrow Z이면 XZX \rightarrow Z종속은 사슬처럼 이어진다

이 세 규칙만으로 FF에 속한 모든 논리적 귀결을 유도할 수 있다는 것이 증명되어 있어(완전성, completeness), 실무에서는 아래 3가지 파생 규칙(derived rule)을 함께 씁니다. 파생 규칙은 위 3개 공리로부터 다시 유도할 수 있는 규칙입니다.

파생 규칙규칙예시
합집합률(union)XYX \rightarrow Y이고 XZX \rightarrow Z이면 XYZX \rightarrow YZ학번→이름, 학번→학과 이면 학번→이름학과
분해율(decomposition)XYZX \rightarrow YZ이면 XYX \rightarrow Y이고 XZX \rightarrow Z학번→이름학과 이면 학번→이름, 학번→학과
의사이행률(pseudotransitivity)XYX \rightarrow Y이고 WYZWY \rightarrow Z이면 WXZWX \rightarrow Z과목코드→담당교수, 담당교수 연구실→예산 이면 과목코드 연구실→예산

예제 데이터에 합집합률을 적용해 보면, 학번이름\text{학번} \rightarrow \text{이름}학번학과\text{학번} \rightarrow \text{학과}로부터

학번{이름,학과}\text{학번} \rightarrow \{\text{이름}, \text{학과}\}

를 바로 유도할 수 있습니다. 이렇게 유도 가능한 함수적 종속을 모두 모은 집합을 FF논리적 귀결 전체라고 하며 F+F^+로 표기합니다.

3. 속성 폐포 — 후보키를 찾는 계산 절차

속성 폐포(attribute closure)는 어떤 속성 집합 XX에서 함수적 종속 집합 FF를 반복 적용해 결정할 수 있는 모든 속성을 모은 집합이며 X+X^+로 표기합니다. 이 계산이 중요한 이유는, X+X^+가 릴레이션 스키마의 전체 속성과 같아지면 XX슈퍼키(super key)라는 뜻이기 때문입니다.

계산 절차(알고리즘):

  1. resultX\text{result} \leftarrow X (자기 자신에서 시작)
  2. FF에 속한 각 종속 YZY \rightarrow Z에 대해, YresultY \subseteq \text{result}이면 resultresultZ\text{result} \leftarrow \text{result} \cup Z
  3. 2단계에서 result\text{result}가 더 이상 커지지 않을 때까지 반복
  4. 최종 result\text{result}X+X^+

예제의 함수적 종속 집합은 다음과 같습니다.

F={ 학번이름,  학번학과,  과목코드과목명,  과목코드담당교수 }F = \{\ \text{학번} \rightarrow \text{이름},\ \ \text{학번} \rightarrow \text{학과},\ \ \text{과목코드} \rightarrow \text{과목명},\ \ \text{과목코드} \rightarrow \text{담당교수}\ \}

X={학번,과목코드}X = \{\text{학번}, \text{과목코드}\}의 폐포 X+X^+를 단계별로 계산합니다.

단계result적용한 FD새로 추가된 속성
초기{학번, 과목코드}--
1{학번, 과목코드, 이름}학번 → 이름이름
2{학번, 과목코드, 이름, 학과}학번 → 학과학과
3{학번, 과목코드, 이름, 학과, 과목명}과목코드 → 과목명과목명
4{학번, 과목코드, 이름, 학과, 과목명, 담당교수}과목코드 → 담당교수담당교수
5더 적용할 FD 없음-종료

최종 X+={학번,이름,학과,과목코드,과목명,담당교수}X^+ = \{\text{학번}, \text{이름}, \text{학과}, \text{과목코드}, \text{과목명}, \text{담당교수}\}로, 수강정보 릴레이션의 전체 속성과 같습니다. 따라서 {학번,과목코드}\{\text{학번}, \text{과목코드}\}는 슈퍼키이며, 이보다 더 작은 부분집합(예: {학번} 하나만)으로는 전체 속성을 결정할 수 없으므로(예: 학번만으로는 과목명을 알 수 없습니다) 이 집합은 후보키입니다.

자주 틀리는 점: 폐포 계산에서 “더 이상 새로 추가되는 속성이 없을 때”가 종료 조건입니다. 한 번의 순회에서 FD를 하나 적용해 보고 바로 멈추면 안 되며, result 전체가 한 바퀴 동안 변하지 않을 때까지 모든 FD를 반복 검사해야 합니다. 순서를 바꿔 가며 여러 번 시도해도 최종 X+X^+는 항상 같은 집합으로 수렴합니다.

4. 최소 커버 — 군더더기 없는 FD 집합

같은 논리적 귀결 F+F^+를 만들어 내는 함수적 종속 집합은 여러 형태로 쓸 수 있습니다. 그중 불필요한 속성이나 중복된 종속이 전혀 없는 가장 간결한 형태를 최소 커버(minimal cover, 정준 커버·canonical cover라고도 함)라 합니다. 정규화 알고리즘(16·17편)은 원래의 FF가 아니라 최소 커버를 입력으로 사용해야 불필요한 분해를 피할 수 있습니다.

최소 커버를 구하는 절차:

  1. 오른쪽을 단일 속성으로 분해한다. 분해율을 이용해 모든 FD의 오른쪽을 속성 하나짜리로 만든다. (예: 학번{이름,학과}\text{학번} \rightarrow \{\text{이름}, \text{학과}\}학번이름\text{학번} \rightarrow \text{이름}학번학과\text{학번} \rightarrow \text{학과}로 나눈다.)
  2. 왼쪽의 불필요한 속성(extraneous attribute)을 제거한다. 각 FD의 왼쪽에서 속성을 하나씩 빼 보고, 빼도 폐포 계산 결과가 똑같이 나오면 그 속성은 불필요하므로 제거한다.
  3. 중복된 FD를 제거한다. 어떤 FD를 통째로 제거해도 나머지 FD들의 폐포로 그 FD가 그대로 유도되면, 그 FD는 중복이므로 제거한다.

예를 들어 F={ 학번이름, 학번학과, 학번 과목코드담당교수, 과목코드담당교수 }F' = \{\ \text{학번} \rightarrow \text{이름},\ \text{학번} \rightarrow \text{학과},\ \text{학번 과목코드} \rightarrow \text{담당교수},\ \text{과목코드} \rightarrow \text{담당교수}\ \}가 주어졌다고 하겠습니다. 세 번째 식 학번 과목코드담당교수\text{학번 과목코드} \rightarrow \text{담당교수}의 왼쪽에서 학번이 불필요한지 검사합니다. 학번을 뺀 {과목코드}\{\text{과목코드}\}의 폐포를 계산하면 과목코드+={과목코드,담당교수}\text{과목코드}^+ = \{\text{과목코드}, \text{담당교수}\}이고, 여기에 이미 담당교수가 포함되어 있으므로 학번은 불필요한 속성입니다. 따라서 세 번째 식은 과목코드담당교수\text{과목코드} \rightarrow \text{담당교수}로 줄일 수 있고, 이는 네 번째 식과 완전히 같으므로 중복 제거 단계에서 하나로 합쳐집니다. 최종 최소 커버는 {학번이름, 학번학과, 과목코드담당교수}\{\text{학번} \rightarrow \text{이름},\ \text{학번} \rightarrow \text{학과},\ \text{과목코드} \rightarrow \text{담당교수}\}입니다.

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): YYXX 전체에는 종속하지만, XX의 어떤 진부분집합(proper subset)에도 종속하지 않는 경우.
  • 부분 함수적 종속(partial functional dependency): YYXX의 진부분집합만으로도 결정되는 경우.

예제에서 기본키는 {학번,과목코드}\{\text{학번}, \text{과목코드}\}입니다. 이름학번(진부분집합) 하나만으로 결정되므로, {학번, 과목코드} → 이름부분 함수적 종속입니다. 반면 만약 수강일수라는 속성이 있고 그 값이 특정 학생이 특정 과목을 들은 기간에 따라서만 정해진다면(학번 하나만으로도, 과목코드 하나만으로도 알 수 없다면) {학번, 과목코드} → 수강일수완전 함수적 종속입니다.

쉽게 말하면: 완전 함수적 종속은 “열쇠 전체가 다 있어야 열리는 자물쇠”, 부분 함수적 종속은 “열쇠 중 일부만 있어도 열리는 자물쇠”입니다.

좋은 스키마 설계를 향한 직관

지금까지 살펴본 개념을 정리하면, “좋은 스키마”란 함수적 종속의 결정자가 모두 그 릴레이션의 (후보)키가 되도록 설계된 스키마입니다. 수강정보 릴레이션의 문제는 과목코드 → 과목명, 과목코드 → 담당교수처럼 키가 아닌 속성이 결정자 역할을 하고 있다는 점입니다. 이 관찰이 바로 16편에서 배울 BCNF(Boyce-Codd 정규형)의 핵심 판별 기준이며, 수강정보를 학생 정보 릴레이션과 과목 정보 릴레이션으로 나누는 것이 16편의 분해 절차입니다.

핵심 정리

  • 함수적 종속 XYX \rightarrow Y는 ”XX 값이 같으면 YY 값도 항상 같다”는 업무 규칙이며, 데이터가 우연히 만족하는 관계가 아니라 도메인이 보장해야 하는 제약이다.
  • Armstrong의 공리(반사율·증가율·이행률)와 파생 규칙(합집합률·분해율·의사이행률)으로 주어진 FF에서 새로운 함수적 종속을 논리적으로 유도할 수 있다.
  • 속성 폐포 X+X^+XX로부터 결정 가능한 모든 속성의 집합이며, X+X^+가 릴레이션 전체 속성과 같으면 XX는 슈퍼키, 더 줄일 수 없으면 후보키다.
  • 최소 커버는 오른쪽 단일화 → 왼쪽 불필요 속성 제거 → 중복 FD 제거 절차로 얻는, 군더더기 없는 함수적 종속 집합이다.
  • 삽입 이상(넣을 수 없음)·삭제 이상(지우면 다른 정보도 사라짐)·갱신 이상(여러 곳을 고쳐야 하고 안 그러면 모순)은 서로 독립적인 개념이 한 릴레이션에 뒤섞여 있을 때 발생하며, 정규화의 존재 이유가 된다.

마무리 복습

문제 14지선다
함수적 종속 X → Y에 대한 설명으로 가장 정확한 것은?
문제 24지선다
학번 → 이름과 학번 → 학과가 성립할 때, 합집합률(union rule)로 유도할 수 있는 것은?
문제 34지선다
F = {학번 → 이름, 학번 → 학과, 과목코드 → 과목명, 과목코드 → 담당교수}일 때, {학번, 과목코드}의 폐포를 계산한 결과로 옳은 것은?
문제 44지선다
수강정보(학번, 이름, 학과, 과목코드, 과목명, 담당교수) 릴레이션에서 C003을 수강하는 학생이 박도윤 한 명뿐일 때, 박도윤의 수강 취소로 그 행을 삭제하면 C003의 과목명·담당교수 정보까지 사라지는 문제는 무엇인가?
문제 54지선다
완전 함수적 종속과 부분 함수적 종속에 대한 설명으로 옳은 것은?

참고 자료

Last updated on