식별자와 좋은 주식별자
식별자는 엔터티 인스턴스를 유일하게 구별합니다. 주식별자는 유일성·최소성·불변성·존재성을 만족하고 업무에서 대표성을 가져야 합니다.
식별자(Identifier)는 엔터티 안의 인스턴스를 서로 구별하는 속성 또는 속성의 조합입니다. 현실에서는 별명이 같아도 대상이 다를 수 있으므로, 업무에서 중복되지 않는 구분 기준이 필요합니다. 데이터 모델의 주식별자는 물리적인 관계형 테이블에서 보통 기본키(Primary Key, PK)로 구현합니다.
공유 자전거 운영 서비스에 ‘초록이’라는 별명의 자전거가 두 대 있다고 해 봅시다. 별명만으로는 어느 자전거인지 알 수 없습니다. 대신 운영 시스템이 발급한 BIKE_ID 101과 102를 쓰면 두 대를 정확히 구분할 수 있습니다.
| BIKE_ | BIKE_ | FRAME_ |
|---|---|---|
| 101 | 초록이 | FR-1001 |
| 102 | 초록이 | FR-1002 |
인스턴스는 자전거 한 대에 해당하는 행이고, BIKE_ID는 그 행을 식별합니다. FRAME_NO처럼 업무상 고유성이 보장되는 다른 값도 식별자 후보가 될 수 있으며, 어떤 후보를 대표 식별자로 고를지는 설계 판단입니다.
BIKE 엔터티에서 BIKE_ID를 주식별자로 선택했습니다. 자전거 별명은 다른 인스턴스와 중복될 수 있으므로 주식별자에 적합하지 않습니다.주식별자는 유일성·최소성·불변성·존재성을 만족하도록 선정합니다. 시험에서는 조건의 이름을 뜻과 연결하거나, 적절하지 않은 주식별자 설명을 고르게 하는 유형이 자주 나옵니다. 네 조건은 유·최·불·존으로 기억합니다. 엔터티를 대표해 다른 엔터티와 참조 관계를 맺을 수 있어야 한다는 대표성도 함께 설명하기도 합니다.
- 유유일성
주식별자로 모든 인스턴스를 하나씩 구분합니다. 같은 값이 두 번 나오지 않습니다.
- 최최소성
유일성에 꼭 필요한 최소 속성만 씁니다. 하나라도 빼면 구분이 안 되는 집합입니다.
- 불불변성
한 번 정한 값은 바뀌지 않아야 합니다. 업무가 바뀐다고 키를 유연하게 고치지 않습니다.
- 존존재성
주식별자에는 반드시 값이 있어야 합니다. NULL을 허용하지 않습니다.
| 조건 | 부적절한 설계 | 개선 방향 |
|---|---|---|
| 유일성 | 자전거 별명 초록이를 PK로 선택 | 중복되지 않는 자전거ID 사용 |
| 최소성 | BIKE_ID만으로 유일한데 (BIKE_ID, BIKE_NAME)을 PK로 사용 | BIKE_ID만 PK로 선택 |
| 불변성 | 담당 운영자의 이름을 자전거 PK로 사용 | 변경 가능성이 낮은 고유번호 사용 |
| 존재성 | 등록되지 않은 식별자에 NULL 허용 | PK에 반드시 값을 부여 |
최소성은 문자열이 짧아야 한다는 뜻이 아니라, 유일성을 보장하는 데 필요하지 않은 속성을 포함하지 않는다는 뜻입니다. 불변성은 키 값이 업무 과정에서 가능하면 바뀌지 않아야 한다는 뜻입니다. 또 DBMS의 PRIMARY KEY 제약은 유일성과 NOT NULL을 강제하지만, 최소성과 불변성까지 자동으로 보장하지는 않습니다. PK 값을 바꾸는 SQL 자체가 원천적으로 금지되는 것도 아닙니다.