주식별자 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의 값이 오직 하나만 연관되어 있을 때 Y는 X에 함수 종속이라 하고, X -> Y
라고 표기한다.
- 고객 번호 -> 고객명
- 주민 번호 -> 고객명
- 폰 번호 -> 고객명
- 이메일 -> 고객명