식별자(identifier)는 엔터티 안의 인스턴스를 하나씩 구분하는 속성입니다. 그 가운데 대표인 주식별자는 유일성·최소성·불변성·존재성 네 조건을 지켜야 합니다.
사원 6명을 하나씩 가리키는 이름표가 겹치거나, 바뀌거나, 비어 있으면 어느 사원의 데이터인지 알 수 없습니다. 그림의 EMAIL과 SQLD 자격번호는 설명용 가상 속성입니다.
1주식별자의 네 조건
| 조건 | 뜻 | 떨어진 후보 | 까닭 |
|---|---|---|---|
| 유일성 | 모든 인스턴스를 구분 | DEPTNO · ENAME | 20이 셋 · 동명이인 |
| 최소성 | 꼭 필요한 속성만 | EMPNO + ENAME | EMPNO만으로 유일 |
| 불변성 | 값이 바뀌지 않음 | 주소는 바뀜 | |
| 존재성 | 값이 꼭 있음 | SQLD 자격번호 | 정하늘은 없음 |
ENAME은 지금 여섯 명이 모두 달라도 떨어집니다. 유일성은 앞으로 들어올 데이터까지 따지기 때문입니다. 주식별자는 업무에서 자주 쓰는 속성으로 정하고, 이름 같은 명칭은 피하며, 속성을 합칠 때는 너무 많지 않게 합니다. 식별자는 논리 모델의 말이고, 물리 모델에서는 키(key)라 부르며 주식별자가 기본키(PK)가 됩니다.
2식별자의 분류
EMPNO 하나에 이름이 넷 붙는 것은 기준이 넷이라서입니다.
| 기준 | 짝 | EMPNO는 |
|---|---|---|
| 대표성 여부 | 주식별자 · 보조식별자 | 주식별자 |
| 스스로 생성 여부 | 내부식별자 · 외부식별자 | 내부식별자 |
| 속성의 수 | 단일식별자 · 복합식별자 | 단일식별자 |
| 대체 여부(업무 번호를 시스템 번호로 대신했나) | 본질식별자 · 인조식별자 | 본질식별자 |
영어로는 Primary·Alternate, Internal·Foreign, Single·Composite, Natural·Surrogate에 Identifier를 붙입니다. EMAIL은 사원을 구분할 수 있지만 대표가 아닌 보조식별자라 참조 관계에 쓰지 않습니다. 사원의 DEPTNO는 다른 엔터티인 부서에서 받아 온 외부식별자이자 속성 레슨의 FK 속성입니다. 사번은 회사가 업무에 쓰는 번호라 본질식별자이고, 업무에 없던 번호를 시스템이 대신 매기면 인조식별자입니다(→ 본질식별자와 인조식별자 레슨).
3식별 관계와 비식별 관계
부모 엔터티의 주식별자가 자식의 어디로 들어가는지에 따라 식별 관계(식별자 관계, Identifying Relationship)와 비식별 관계(비식별자 관계, Non-Identifying Relationship)로 나뉩니다.
| 관계 | 부모의 주식별자가 | IE 선 | 부모 없는 자식 |
|---|---|---|---|
| 식별 관계 | 자식의 주식별자로 | 실선 | 있을 수 없음 |
| 비식별 관계 | 자식의 주식별자가 아닌 속성(FK)으로 | 점선 | 있을 수 있음 |
시험 자료가 비식별 관계를 '자식의 일반 속성으로만 쓴다'고 적을 때 '일반'은 '주식별자가 아닌'이라는 뜻입니다. 속성 레슨의 일반 속성(PK도 FK도 아닌 속성)과는 다른 말입니다. 앞 레슨 그림에서 부서·사원 사이 선이 논리 모델부터 점선이었던 것도 비식별 관계라서입니다. 식별 관계에서는 받은 속성만으로 자식의 주식별자를 만드는지가 차수를 정합니다.
| 주문의 자식 | 자식의 주식별자 | 주문 하나에 |
|---|---|---|
| 배송(주문마다 한 번) | 주문번호 | 하나 — 1 : 1 |
| 주문상품 | 주문번호 + 상품번호 | 여럿 — 1 : N |
더하는 속성은 상품번호처럼 다른 부모에게 받아도, 자기 속성이어도 됩니다. 비식별 관계는 부모 없는 자식이 생길 수 있거나, 부모와 자식의 생명주기(데이터가 생기고 지워지는 때)가 다르거나, 자식에게 따로 주식별자를 두는 편이 나으면 고릅니다. 식별 관계만 쓰면 아래로 갈수록 주식별자 속성이 늘고, 비식별 관계만 쓰면 부모 정보를 찾을 때 조인(나눠 둔 테이블의 행을 조건으로 이어 한 줄로 보는 것 — 관계와 조인 레슨에서 자세히)이 늘어납니다.
예제
INSERT(테이블에 새 행을 넣는 SQL 문장)로 동명이인 김민준을 넣으면 ENAME은 바로 겹칩니다.
INSERT INTO EMP
(EMPNO, ENAME, SAL)
VALUES (1007, '김민준', 400);
SELECT EMPNO,
ENAME,
SAL
FROM EMP
WHERE ENAME = '김민준'
ORDER BY EMPNO;
| EMPNO | ENAME | SAL |
|---|---|---|
| 1001 | 김민준 | 520 |
| 1007 | 김민준 | 400 |
기본키 EMPNO는 DBMS가 유일성과 존재성을 지켜 줍니다. 이미 있는 사번이나 빈 사번으로는 행이 들어가지 않습니다.
SQL로 확인하기
INSERT INTO EMP
(EMPNO, ENAME, SAL)
VALUES (1001, '한별',
400);
INSERT INTO EMP
(EMPNO, ENAME, SAL)
VALUES (NULL, '한별',
400);첫 INSERT는 이미 있는 사번이라 ORA-00001(unique constraint violated), 둘째는 빈 사번이라 ORA-01400(cannot insert NULL) 오류가 납니다.
시험 포인트
- 지금 겹치지 않는 이름을 주식별자로 고른 보기는 틀립니다. 유일성은 앞으로 들어올 데이터까지 봅니다.
- 유일한 조합이라도 그 일부만으로 유일하면 최소성에 어긋납니다.
- 보조식별자는 참조 관계에 쓰지 않습니다. 외부식별자는 다른 엔터티에서 받아 온 식별자(FK)입니다.
- '대체 여부'는 본질·인조를 가르는 기준입니다. 보조식별자의 영어 Alternate(대체)에 끌려 주·보조를 고르면 틀립니다.
- IE에서 식별 관계는 실선, 비식별 관계는 점선입니다. 바커의 점선(선택 참여)과 뜻이 다릅니다.
- 받은 속성만으로 자식의 주식별자를 만들면 1 : 1, 다른 속성을 더하면 1 : N입니다.
- 식별 관계만 쓰면 주식별자 속성이, 비식별 관계만 쓰면 조인이 늘어납니다.
확인 문제
1. 사원 엔터티의 주식별자를 '사번 + 입사일'로 정했습니다. 입사일은 사원마다 반드시 있고 바뀌지 않습니다. 네 조건 가운데 어긋나는 조건은 무엇일까요?
정답
최소성입니다. 사번 하나로 모든 사원을 구분할 수 있어 입사일은 필요 없습니다. 두 속성 모두 늘 있고 바뀌지 않아 존재성·불변성은 지키고, 사번 덕분에 유일성도 지킵니다.
2. 수강 엔터티의 주식별자는 '학번 + 과목코드'이고, 학번은 학생에게서 받아 왔습니다.
- (가) 수강의 학번은 내부식별자와 외부식별자 가운데 무엇일까요?
- (나) 학생과 수강의 관계는 식별 관계와 비식별 관계 가운데 무엇일까요?
- (다) 주식별자를 학번만으로 만들면 학생 한 명에 수강이 몇 개까지 있을 수 있을까요?
정답
(가) 외부식별자, (나) 식별 관계, (다) 하나입니다. 학번은 학생과의 관계로 받아 왔고, 그 학번이 수강의 주식별자 안에 있습니다. 학번만으로 주식별자를 만들면 한 학생의 수강을 둘 넣을 수 없어 1 : 1이 됩니다.
3. 부서와 사원의 관계는 식별 관계일까요, 비식별 관계일까요? EMP의 데이터로 까닭을 설명하세요.
정답
비식별 관계입니다. EMP의 주식별자는 EMPNO 하나이고, 부서에서 받아 온 DEPTNO는 주식별자에 들지 않는 FK 속성입니다. 그래서 정하늘(1005)처럼 DEPTNO가 NULL인, 곧 부서 없는 사원이 있을 수 있습니다. 식별 관계였다면 DEPTNO가 주식별자의 일부가 되어 NULL일 수 없습니다.