식별자 : 하나의 엔터티에 구성되어 있는 여러 개의 속성 중에 엔터티를 대표할 수 있는 속성.
하나의 엔터티는 반드시 하나의 유일한 식별자가 존재해야 한다.
주식별자
- 주식별자에 의해 엔터티 내에 모든 인스턴스들이 유일하게 구분되어야 한다.
- 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 한다.
- 지정된 주식별자의 값은 자주 변하지 않는 것이어야 한다.
- 주식별자가 지정이 되면 반드시 값이 들어와야 한다.
대체식별자 : 주식별자의 특징과 일치한다.
외부식별자 : 주식별자와 특징이 일치하지 않고 참조무결성 제약조건에 따른 특징 있다.
식별자 분류
엔터티 내의 대표성 유무 : 주식별자와 보조식별자
스스로 생성되었는지 : 내부식별자와 외부식별자
단일 속성인가 : 단일식별자와 복합식별자
식별자 속성을 대체하는가 : 본질식별자와 인조식별자
주식별자를 도출하기 위한 기준
- 해당 업무에서 자주 이용되는 속성을 주식별자로 지정
- 명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않는다.
- 복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.
가. 해당 업무에서 자주 이용되는 속성을 주식별자로 지정하도록 함
예를 들면, 직원이라는 엔터티가 있을 때 유일하게 식별가능한 속성으로는 주민등록번호와 사원번호가 존재할 수 있다. 사원번호가 그 회사에서 직원을 관리할 때 흔히 사용되므로 주식별자로 지정하고 주민등록번호는 보조식별자로 지정 가능하다.
나. 명칭, 내역 등과 같이 이름으로 기술되는 것은 피함
만약 유일하게 식별 가능하여 부서이름을 주식별자로 하면, WHERE 조건절을 기술할 때 항상 부서이름을 사용해야 한다. 부서이름의 경우 길면 20자 이상이 될 수 있어서 기술하기 쉬운 일이 아니다.
인스턴스들을 식별할 수 있는 다른 구분자가 존재하지 않을 시 새로운 식별자를 만든다. 일련번호와 코드를 많이 쓴다.
부서명과 같은 경우는 부서코드를 부여해 코드엔터티에 등록한 후 부서코드로 주식별자를 지정하는 방법과 부서일련번호(부서번호)를 주식별자로 하고 부서명은 보조식별자로 활용하는 두 가지 방법이 있다.
다. 속성의 수가 많아지지 않도록 함
주식별자로 선정하기 위한 속성이 복합으로 구성되어 주식별자가 될 수 있을 때 가능하면 주식별자 선정하기 위한 속성의 수가 많지 않도록 해야 한다.
일반적으로 주식별자의 속성의 개수가 많다는 것(7~8개 이상)은 새로운 인조식별자를 생성하여 데이터 모델을 구성하는 것이 데이터 모델을 한층 더 단순하게 하고 애플리케이션을 개발할 때 조건절을 단순하게 할 수 있다.
가.식별자관계와 비식별자 관계의 결정
외부식별자 : 다른 엔터티와의 관계를 통해 자식 쪽 엔터티에 생성되는 속성.
자식엔터티에서 부모엔터티로부터 받은 외부식별자를 자신의 주식별자로 이용할 것인지 또는 부모와 연결이 되는 속성으로서만 이용할 것인지를 결정해야 한다.
나.식별자관계
식별자관계 : 자식엔터티의 주식별자로 부모의 주식별자가 상속이 되는 경우
부모로부터 받은 식별자를 자식엔터티의 주식별자로 이용하는 경우 NULL값이 오면 안되므로 반드시 부모엔터티가 생성되어야 자기 자신의 엔터티가 생성되는 경우. 부모로부터 받은 속성을 자식엔터티가 모두 사용하고 그것만으로 주식별자로 사용한다면 부모엔터티와 자식엔터티의 관게는 1:1 관계가 될 것이다.
부모로부터 받은 속성을 포함하여 다른 부모엔터티에서 받은 속성을 포함하거나 스스로 가지고 있는 속성과 함께 주식별자로 구성되는 경우는 1:M 관계가 된다.
다.비식별자관계
부모엔터티로부터 속성을 받지만 주식별자로 쓰지않고 일반 속성으로 사용하는 경우.
비식별자 관계는 다음의 네 가지 경우에 비식별자 관계에 의한 외부속성을 생성한다.
- 자식엔터티에서 받은 속성이 반드시 필수가 아니어도 무방하기에 부모 없는 자식이 생성될 경우.
- 엔터티별로 데이터 생명주기를 다르게 관리할 경우.
- 여러 개의 엔터티가 하나의 엔터티로 통합되어 표현되었는데 각각의 엔터티가 별도의 관계를 가질 때.
- 자식엔터티에 주식별자로 사용하여도 되지만 자식엔터티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때 비식별자 관계에 의한 외부식별자로 표현.
1:M 관계의 식별자관계의 PK속성의 수는 다음과 같다.
이와 같은 규칙으로 데이터 모델의 흐름이 길어질수록 증가할 수 밖에 없는 구조이다.
SQL구문을 보면 WHERE절이 매우 길어진다.
이는 개발자 복잡성과 오류가능성을 유발시킬 수 있는 요인이 될 수 있다.
각 엔터티 간의 관계를 비식별자 관계로 설정하면 자식엔터티로 상속이 되지 않아 자식엔터티에서 데이터를 처리할 때 쓸데없이 부모엔터티까지 찾아가야 하는 경우가 발생한다. 이는 불필요한 조인이 다량으로 발생시켜 성능이 저하된다.
바.식별자관계와 비식별자관계 모델링
1) 비식별자관계 선택 프로세스
기본적으로 식별자관계로 모든 관계가 연결되면서 다음 조건(아래 그림)에 해당할 경우 비식별자관계로 조정하면 된다.
가장 중요한 요인은 자식엔터티의 독립된 주식별자 구성이 필요한지를 분석하는 부분이다. 독립적으로 주식별자를 구성한다는 의미는 업무적 필요성과 성능상 필요여부를 모두 포함하는 의미로 이해하면 된다.
2) 식별자와 비식별자관계 비교
강한 관계인 식별자관계와 약한 관계인 비식별자관계를 비교하면 아래 표와 같이 나타낼 수 있다.
3) 식별자와 비식별자를 적용한 데이터 모델
상기 모델은 업무의 특성에 따라 식별자관계와 비식별자관계를 적절하게 선택함으로써 데이터 모델의 균형감을 갖추었다고 볼 수 있다.
출처: SQL 전문가 가이드, https://dataonair.or.kr/