주식별자와 후보식별자

주식별자 vs 후보식별자

주식별자와 후보식별자 모두 유일성최소성 특징을 만족한다. 둘 중 NOT NULL을 만족시키면서 적절한 키를 주식별자로 정하게 된다. 주식별자 외 식별자들은 후보식별자가 된다. 후보식별자들은 NULL 을 허용할 수 있다는 것이 주식별자와의 차이점이다.

참고

후보키의 인덱스 생성 시 물리적으로 인스턴스의 유일성을 보장해주기 위해 UNIQUE 인덱스를 생성하는 것이 바람직하다. 후보키들의 인덱스 테이블을 별도로 만들어 두면 특정 레코드에 빨리 접근하는 데 도움이 될 수 있다.

어떤 것을 주식별자로 정할 것인지?

중요하면서도 어려운 것이 주식별자를 선정하는 일이다. 주식별자는 테이블 설계 시 명시적으로 DB에 선언해줘야 한다. 주식별자를 선언해주면 대응하는 인덱스 테이블이 자동으로 생성된다.

주식별자를 어떻게 선정하는지 아래 테이블 스키마 예제를 통해 살펴보자.

주민 번호 고객명 폰번호 이메일 집주소 고객번호
000000-xxxxxxx 홍길동 010-xxxx-oooo email@gmail.com 서울시 강남구 111-1 12345

1. 위 필드 중 UNIQUE 특징을 만족하는 필드는???

  • 주민 번호
  • 폰 번호
  • 이메일
  • 고객 번호(=회사에서 지정한 고객 식별 번호)

UNIQUE 속성을 만족하지 않으면 주식별자의 자격이 없다.

고객명은 동명이인이 존재할 수 있고, 집 주소는 한 집에 여럿이 사는 경우 중복이 발생할 수 있다. 따라서 고객명과 집 주소는 UNIQUE 속성을 만족하지 않는다.

2. 1번 을 만족하면서, NOT NULL 을 만족하는 필드는?

  • 주민 번호
  • 고객 번호

NOT NULL 속성을 만족하지 않으면 주식별자의 자격이 없다.

핸드폰이 없는 사람이 존재할 수도 있고, 이메일이 없는 사람도 존재할 수 있기 때문에 NOT NULL 을 만족하지 않을 있다.

결국 주식별자로 채택될 만한 필드는 주민 번호, 고객 번호가 있다.

그럼 둘 중에 어떤 것이 주식별자로 채택하기 적합할까???

주민 번호고객 번호 의 데이터가 어떤 측면에서 제공되는지 살펴봐야 한다.

주민 번호는 고객 쪽에서 제공하는 데이터이고, 고객 번호는 DB를 관리하는 주체(회사)에서 제공하는 데이터다.

일반적으로 고객들이 제공하는 데이터들은 주식별자로 채택 하지 않는다.

고객쪽에서 제공하는 데이터는 100% 확률로 안전하다고 볼 수 없다. 반면에 회사측에서 제공 또는 부여하는 데이터는 100% 확률로 보장할 수 있기 때문에 고객쪽 데이터는 주식별자로 채택하지 않는 것이 좋다.

주민번호 경우에도 100% 확률로 확인할 수 있다는 보장이 없다. 따라서, 고객 번호를 주식별자로 정하는 것이 적합하다.


결정자 vs 종속자

방금 살펴폰 테이블 스키마를 가지고 결정자와 종속자를 구분해보자.

  • 결정자(Determinant attribute): 이 값을 알면 나머지 속성 값도 알 수 있는(정해지는) 속성이다.
    • 고객 번호
  • 종속자(Dependent attribute): 결정자에 의해 정해지는 속성이다.
    • 주민 번호
    • 고객명
    • 폰 번호
    • 이메일
    • 집 주소

Functional Dependency(함수 종속성)

두 개의 애트리뷰트 집합 간의 제약의 일종이다. 애트리뷰트 X의 값 각각에 대해 시간에 관계없이 항상 애트리뷰트 Y의 값이 오직 하나만 연관되어 있을 때 YX에 함수 종속이라 하고, X -> Y라고 표기한다.

  • 고객 번호 -> 고객명
  • 주민 번호 -> 고객명
  • 폰 번호 -> 고객명
  • 이메일 -> 고객명