[Database] 키의 종류와 기능

[Database] 키의 종류와 기능

DB를 공부하다 보면 테이블과 레코드, 필드 다음으로 많이 접하는 단어는 아마도 기본 키, 왜래 키와 같은 키(key)일것이다.
이러한 종류의 키들은 DB에서 데이터의 무결성을 유지하기 위한 중요한 수단
DBMS에서 이용하는 키(key)에는 여러 종류가 있으며 다음과 같다.



1. 슈퍼 키(Super Key)

  • 테이블에 존재하는 필드들의 부분집합으로써
    • 즉, 하나 이상의 속성들의 집합으로 이루어진 것
  • 유일성은 만족하지만 최소성은 만족하지 않아도 됨
    • 유일성 : 하나의 키로 어떠한 행을 바로 찾아낼 수 있는 능력
      후보키나, 기본키가 만족하는 것들
    • 최소성 : 꼭 필요한 속성들로만 구성해야 하는 것
      슈퍼키를 보면 예를들어서, 학번 + 주민등록번호 이렇게 굳이 합쳐서 사용하므로 공간낭비가 나오므로 최소성은 만족하지 않음
  • 슈퍼키안에 후보키가 있고, 후보키를 보면 기본키와 대체키로 나뉘어짐

2. 후보 키(Candidate key)

  • 기본 키가 될 수 있는 후보
  • 후보키는 테이블에 존재하는 전체 필드의 부분집합
  • 유일성최소성을 만족해야 함

3. 기본 키(Primary key)

  • 테이블에서 특정 레코드를 구별하기 위해 후보 키중에서 선택된 고유한 식별자
  • 유일성최소성의 속성을 가져야 하며, NULL값을 가질 수 없다.
  • 기본키를 설정할 때 아래와 같은 두 가지 사항을 고려하는 것이 좋다
    • 값이 자주 변경되지 않는 것을 선택
      기본키의 값이 변경될때 마다 해당 값이 유일한지, NULL값이 아닌지를 검사해야 하므로 자주 변경되지 않는것이 좋음
    • 값이 단순한 것을 선택
      짧고 단순한 데이터를 저장하는 필드를 기본키로 설정하는것이 DBMS의 성능에 유리

4. 대체 키(Alternate key)

  • 후보 키 중에서 기본 키로 선택된 것들을 제외한 모든 키

5. 복합 키(Composite key)

  • 한 개 이상의 필드를 포함하는 키를 복합 키라고 함
    • ex) {학번 + 이름}와 같은 키

6. 외래 키(Foreign key)

  • 한 테이블의 키 중에서 다른 테이블의 레코드를 유일하게 식별할 수 있는 키
  • 외래키는 한 테이블의 레코드에서 다른 테이블의 레코드를 참조하기 위해 이용
  • 위의 그림은 product 테이블을 참조하는 order테이블 
  • order테이블의 product_id필드는 product테이블의 레코드를 참조하기 위해 설정된 외래 키
  • 외래키는 아래와 같은 속성들을 갖는다
    • 하나의 필드 또는 전체 필드의 부분집합으로 구성된다.
    • 중복된 값과 NULL값을 가질 수 있다
    • 반드시 참조되는 테이블(product)에서 유일한 값을 갖는 필드를 참조해야 한다.
      예를 들어, 외래키는 참조되는 테이블의 기본 키를 참조할 수도 있다.
    • 참조되는 테이블(product)에 존재하는 값만을 가져야 한다.
      NULL값은 실제로 존재한는 값은 아니지만, 많은 DB에서는 NULL값을 예외로 한다

3. 외래 키와 참조 무결성

  • DB에서는 참조 무결성을 위해 참조 대상이 존재하지 않는 외래 키를 허용하지 않는다.
    즉, 어떠한 외래 키 B가 A를 참조한다면, A는 반드시 DB에 존재해야 한다.
  • 외래 키는 참조 무결성을 지키기 위해 밑의 3가지의 개념을 외래키에 적용할 수 있도록 기능을 제공
    • RESTRICTED : 레코드를 변경 또는 삭제(product에 있는 레코드)하고자 할 때 해당 레코드를 참조하는 개체(order)가 있다면, 변경 또는 삭제 연산을 취소한다.
    • CASCADE : 레코드를 변경 또는 삭제하면, 해당 레코드를 참조하고 있는 개체도 변경 또는 삭제 됨.
    • SET NULL : 레코드를 변경 또는 삭제하면, 해당 레코드를 참조하고 있는 개체의 값을 NULL으로 설정

출처



댓글

이 블로그의 인기 게시물

[Python] # -*- coding: utf-8 -*-를 쓰는 이유

[소프트웨어공학] NS(Nassi-Schneiderman) 차트

[컴퓨터네트워크] Telnet이란?