노트

함수 종속과 후보키

Functional Dependency and Candidate Key

백엔드#db · 연결된 개념 3개

쉽게 말하면

함수 종속은 자판기 버튼 번호를 누르면 나오는 음료가 하나로 정해지듯, 한 값이 다른 값을 딱 하나로 정하는 관계예요. 이걸 찾아야 무엇이 무엇을 정하는지에 맞춰 표를 제대로 나눌 수 있죠.

비유가 깨지는 곳 실제 키는 여러 칸일 수 있어요. 복합키 일부에만 종속되면 부분 종속(2NF 위반), 다른 컬럼을 거쳐 정해지면 이행 종속(3NF 위반)이고, 한 값이 집합을 정하면 다치 종속이에요.

함수 종속(functional dependency)은 "A 값이 정해지면 B 값이 하나로 정해진다"는 관계로, A → B로 쓴다. 학번을 알면 이름을 안다면 학번 → 이름이다. 정규화의 각 단계는 특정한 종속을 없애는 작업이다.

용어

  • 결정자(determinant): 다른 속성 값을 유일하게 정하는 속성. 학번 → 이름에서 학번
  • 후보키(candidate key): 각 행을 유일하게 식별하는 최소한의 속성 집합. 유일성과 최소성을 모두 만족해야 한다. 학번·주민번호·이메일은 후보키가 될 수 있지만, (학번, 이름)은 학번만으로 충분하므로 최소성을 어긴다
  • 기본키(primary key): 후보키 중 대표로 고른 하나

종속의 종류

  • 부분 종속(partial dependency): 복합키의 일부에만 종속된다. (주문번호, 상품코드)가 키인데 주문일자가 주문번호에만 종속 → 2NF 위반
  • 이행 종속(transitive dependency): A → B → C처럼 다른 컬럼을 거쳐 간접적으로 종속된다. 사번 → 부서코드 → 부서명 → 3NF 위반
  • 결정자이지만 후보키가 아님: 교수 → 과목인데 교수가 후보키가 아님 → BCNF 위반
  • 다치 종속(Multivalued Dependency, MVD): A →→ B. A 값 하나에 B 값의 집합이 대응하고, 그것이 다른 속성과 무관하게 결정된다. 학생의 취미 집합과 외국어 집합이 독립인데 한 테이블에 두면 모든 조합이 생긴다 → 4NF 위반
함수 종속  A → B   : A가 정해지면 B는 하나
다치 종속  A →→ B  : A가 정해지면 B는 집합

이 관계를 찾는 일은 결국 "이 사실은 무엇에 의해 정해지는가"를 묻는 도메인 분석이다. 같은 질문을 코드 쪽에서 하면 응집도가 되고, 키 구조를 잘못 잡으면 무결성 제약도 제대로 걸 수 없다.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 그래프

    정점(vertex, 노드)과 정점들을 잇는 간선(edge)으로 이루어진 자료구조. 트리도 그래프의 한 종류다. SNS 친구 관계, 지도와 경로, 웹 페이지 링크, 추천 시스템, 패키지 의존성처럼 "무엇과 무엇이 연결돼 있다"는 모든 것을 표현한다. 이 지식 맵도 노트를 정점, 링크를 간선으로 한 그래프다.

  • 영속성 전이 (cascade)

    영속성 전이(cascade, transitive persistence)는 부모 엔티티에 한 영속성 작업(저장·병합·삭제 등)을 연관된 자식 엔티티에도 자동으로 적용하는 JPA 옵션이다. 기본값은 아무것도 전이하지 않는 것이다.

  • 최종 일관성

    최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.

  • DB 인덱스와 트레이드오프

    DB 인덱스는 특정 컬럼 값으로 행을 빨리 찾도록 테이블 옆에 따로 유지하는 보조 자료구조(auxiliary data structure)다. 관계형 DB의 기본 인덱스는 정렬된 균형 트리(B-tree 계열)라서, 전체를 훑지 않고 트리를 따라 내려가 원하는 행에 닿는다.

  • 해시 테이블

    키를 해시 함수(Hash Function)로 배열 인덱스로 바꿔 값을 저장하는 자료구조. 조회·추가·삭제가 평균 O(1)이다. JavaScript의 객체와 Map·Set, 파이썬의 dict·set(python-collections), 자바의 HashMap이 모두 해시 테이블이다.

보기 옵션