본문으로 건너뛰기

식별자

SQLD 목차데이터 모델링의 이해레슨 6 / 35

목차

식별자(identifier)는 엔터티 안의 인스턴스를 하나씩 구분하는 속성입니다. 그 가운데 대표인 주식별자는 유일성·최소성·불변성·존재성 네 조건을 지켜야 합니다.

사원 6명을 하나씩 가리키는 이름표가 겹치거나, 바뀌거나, 비어 있으면 어느 사원의 데이터인지 알 수 없습니다. 그림의 EMAIL과 SQLD 자격번호는 설명용 가상 속성입니다.

8단계 중 1단계. 식별자는 엔터티 안의 인스턴스를 하나씩 구분하는 속성이고, 그중 대표 하나를 주식별자로 고릅니다.

1주식별자의 네 조건

조건뜻떨어진 후보까닭
유일성모든 인스턴스를 구분DEPTNO · ENAME20이 셋 · 동명이인
최소성꼭 필요한 속성만EMPNO + ENAMEEMPNO만으로 유일
불변성값이 바뀌지 않음EMAIL주소는 바뀜
존재성값이 꼭 있음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;
EMPNOENAMESAL
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일 수 없습니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

SQLD 목차로