[SQL] 식별자(Identifiers)
식별자 개념
식별자란 하나의 엔터티에 구성되어 있는 여러 개의 속성 중에 엔터티를 대표할 수 있는 속성을 의미하며, 하나의 엔터티는 반드시 하나의 유일한 식별자가 존재해야 한다. 보통 식별자와 키를 동일하게 생각하는 경우가 있는데 식별자라는 용어는 업무적으로 구분이 되는 정보로 생각할 수 있으므로 논리 데이터 모델링 단계에서 사용하고 키는 DB 테이블에 접근을 위한 매개체로서 물리 데이터 모델링 단계에서 사용한다.
식별자 특징
식별자의 특징은 식별자의 종류에 따라 다르다. 필자는 주식별자, 대체식별자, 외부식별자 3가지에 대한 특징만 언급하겠다.
- 주식별자
- 유일성
주식별자에 의해 엔터티 내에 모든 인스턴스들이 유일하게 구분되어야 한다.
- 최소성
주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 한다.
- 불변성
지정된 주식별자의 값은 자주 변하지 않는 것이어야 한다.
- 존재성
주식별자가 지정이 되면 반드시 값이 들어와야 한다.
- 유일성
- 대체식별자
대체식별자는 주식별자와 특징이 같다.
- 외부식별자
외부식별자는 주식별자와 특징이 일치하지 않으며 참조무결성 제약조건에 따른 특징을 가지고 있다.
식별자 분류
식별자의 분류에 대한 내용은 다음 표와 같다.
식별자 표기법
식별자에 대한 위의 분류방법을 데이터 모델에서 표현하면 아래 그림과 같다.
주식별자 도출기준
데이터 모델링 작업에서 중요한 작업 중의 하나가 주식별자 도출작업이다. 주식별자를 도출하기 위한 기준을 정리하면 다음과 같다.
- 헤당 업무에서 자주 이용되는 속성을 주식별자로 지정한다.
- 명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않는다.
- 복합으로 주식별자를 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.
식별자관계와 비식별자관계에 따른 식별자
식별자관계와 비식별자관계의 결정
외부식별자는 자기 자신의 엔터티에서 필요한 속성이 아니라 다른 엔터티와의 관계를 통해 자식 쪽에 엔터티에 생성되는 속성을 말한다. DB 생성 시에 Foreign key 역할을 한다. 관계와 속성을 정의하고 주식별자를 정의하면, 논리적인 관계에 의해 자연스럽게 외부식별자가 도출되지만 중요하게 고려해야할 사항이 있다. 엔터티에 주식별자가 지정되고 엔터티 간 관계를 연결하면 부모쪽의 주식별자를 자식엔터티의 속성으로 내려보낸다. 이때 자식 엔터티에서 부모엔터티로부터 받은 외부식별자를 자신의 주식별자로 이용할 것인지, 부모와 연결이 되는 속성으로만 이용할 것인지를 결정해야 한다.
식별자관계
부모로부터 받은 식별자를 자식엔터티의 주식별자로 이용하는 경우는 Null값이 오면 안되므로 반드시 부모엔터티가 생성되어야 자기 자신의 엔터티가 생성되는 경우다. 부모로부터 받은 속성을 자식엔터티가 모두 사용하고 그것만으로 주식별자로 사용한다면, 부모엔터티와 자식엔터티의 관계는 1:1의 관계가 될 것이다. 만약 부모로부터 받은 속성을 포함하여 다른 부모엔터티에서 받은 속성을 포함하거나 스스로 가지고 있는 속성과 함께 주식별자로 구성되는 경우는 1:M 관계가 된다.
식별자관계를 맺을 때 주의할점이 있다. 만약 엔터티간의 관계를 식별자로만 설정할 때 문제가 발생할 수 있다. 아래 그림을 살펴보자.
위 그림은 식별자 관계로만 개체를 연결하여 PK속성이 매우 증가된 예이다. 이럴 경우 엔터티의 정보를 가져올 때 비효율적인 쿼리를 작성하게 되고 길이 또한 매우 길어진다. 때문에 개발 복잡성과 잦은 오류를 유발한다. 따라서 엔터티간의 관계를 설정할 때 적절한 식별자 사용이 매우 중요하다.
비식별자관계
부모엔터티로부터 속성을 받았지만 자식엔터티의 주식별자로 사용하지 않고 일반적인 속성으로만 사용하는 경우가 있는데, 이와 같은 경우를 비식별자관계라고 한다.
다음의 4가지 경우에 비식별자관계에 의한 외부속성을 생성한다.
- 자식엔터티에서 받은 속성이 반드시 필수가 아니어도 무방하므로 부모 없는 자식이 생성될 수 있는 경우
- 엔터티별로 데이터의 생명주기를 다르게 관리할 경우
예를 들어 부모엔터티에 인스턴스가 자식의 엔터티와 관계를 가지고 있었지만, 자식만 남겨두고 먼저 소멸될 수 있는 경우가 이에 해당한다. 이에 대한 방안으로 물리DB 생성 시 Foreign Key를 연결하지 않는 임시적인 방법을 사용하기도 하지만, 데이터 모델상에서 관계를 비식별자관계로 조정하는 것이 가장 좋은 방법이다.
- 여러 개의 엔터티가 하나의 엔터티로 통합 및 표현되었는데 각각의 엔터티가 별도의 관계를 가질 경우외부식별자의 비식별자 역할
- 자식엔터티에 주식별자로 사용하여도 되지만 자식 엔터티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 경우자식엔터티의 독립 주식별자
비식별자 관계 설정 시 마찬가지로 주의할 점이 있다.
일반적으로 각각의 엔터티에는 중요한 기준 속성이 있다. 이 기준 속성은 부모엔터티에 있는 PK속성으로부터 상속되어 자식엔터티에 존재하는 경우가 많다. 이러한 속성의 예로 ‘주민등록번호’, ‘사원번호’ 등이 있는데, 데이터 모델링을 전개할 때 각 엔터티 간의 관계를 비식별자관계로 설정하면 이런 유형의 속성이 자식 엔터티로 상속되지 않아 자식엔터티에서 데이터를 처리할 때 쓸데없이 부모엔터티까지 찾아가야 하는 경우가 발생한다.
때문에 쿼리에 많은 조인이 걸리게 되고 그에 따른 복잡성 증가와 성능이 저하된다. 따라서 아래서 제시할 고려사앙을 데이터 모델링에 반영한다면 효과적인 데이터 모델을 만들어 유용하게 활용할 수 있다.
식별자관계와 비식별자관계 모델링
비식별자관계 선택 프로세스
실제 프로젝트를 전개할 때 식별자관계와 비식별자관계를 취사선택하여 연결하는 내공 높은 수준의 기술을 요한다. 특히 식별자관계에서 비식별자관계를 파악하는 기술이 필요로하다. 다음 흐름에 따라 비식별자 관계를 선정한다면 합리적인 관계를 설정하는 모습이 될 수 있다.
기본적으로 식별자관계로 모든 관계가 연결되면서 다음 조건에 해당할 경우 비식별자관계로 조정하면 된다.
여기서 가장 중요한 요인은 자식 엔터티의 독립된 주식별자 구성이 필요한지를 분석하는 것이다. 독립적으로 주식별자를 구성한다는 것은 업무적 필요성과 성능상 필요 여부를 모두 포함하는 의미로 이해하면 된다.
식별자관계와 비식별자관계 비교
식별자관계와 비식별자관계를 비교하는 내용은 다음과 같다.
식별자와 비식별자를 적용한 데이터 모델의 예
위와 같은 기준에 의해 식별자와 비식별자관계가 적절하게 설정된 모델의 예는 다음과 같다.
읽어주셔서 감사합니다. 😊
Reference
SQL 전문가 가이드 - Kdata 한국데이터산업진흥원










