- 식별자(Identifiers) 개념
- 하나의 엔티티에 구성되어 있는 여러 개의 속성 중에 엔티티를 대표할 수 있는 속성의 의미
- 하나의 엔티티는 반드시 하나의 유일한 식별자가 존재해야 함
-
보통 식별자와 키(Key)를 동일하게 생각하는 경우가 있는데 식별자라는 용어는 업무적으로 구분이 되는 정보로 논리 데이터 모델링 단계에서 사용하고 키는 데이터베이스 테이블에 접근을 위한 매개체로서 물리 데이터 모델링 단계에서 사용
- 식별자의 특징
- 주식별자에 의해 엔티티내에 모든 인스턴스들이 유일하게 구분되어야 한다.
- 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 한다.
- 지정된 주식별자의 값은 자주 변하지 않는 것이어야 한다.
-
주식별자가 지정이 되면 반드시 값이 들어와야 한다.
-
식별자 분류 및 표기법
가. 식별자 분류
- 자신의 엔티티 내에서 대표성을 가지는가에 따라 주식별자와 보조식별자
- 엔티티 내에서 스스로 생성되었는지 여부에 따라 내부식별자와 외부식별자
- 단일 속성으로 식별이 되는가에 따라 단일식별자와 복합식별자
-
업무적으로 의미가 있던 식별자 속성을 대체하여 일련번호와 같이 새롭게 만든 식별자를 구분하기 위해 본질식별자와 인조식별자
나. 식별자 표기법
- 주식별자 도출기준
- 해당 업무에서 자주 이용되는 속성을 주식별자로 지정한다.
- 명칠, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않는다.
-
복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.
가. 해당 업무에서 자주 이용되는 속성을 주식별자로 지정하도록 함
-
직원이라는 엔티티가 있을 때 유일하게 식별가능한 속성으로는 주민등록번호와 사원번호가 존재할 수 있다. 사원번호가 그 회사에서 직원을 관리할 때 흔히 사용되므로 사원번호를 주식별자로 지정하고 주민등록번호는 보조식별자로 사용할 수 있다.
나. 명칭, 내역 등과 같이 이름으로 기술되는 것은 피함
- 한 회사에 부서이름이 100개 가 있다고 할 때, 각각의 부서이름은 유일하게 구별될 수 있다고 하여 부서이름을 주식별자로 지정하지 않도록 해야 한다.
- 물리적 데이터베이스에서 데이터를 읽을 때 항상 부서이름이 where 조건절에 기술되는 현상이 발생되고, 부서이름은 많은 경우 20자 이상이 될 수 있으므로 오타가 날수도 있다.
-
명칭이나 내역이 있고 인스턴스들을 식별할 수 있는 다른 구분자가 존재하지 않을 경우는 새로운 식별자를 생성하도록 한다. 보통 일련번호와 코드를 많이 사용한다.
다. 속성의 수가 많아지지 않도록 함
- 만약 주식별자로 선정된 속성들이 자신이 가지고 있는 자식엔티티로부터 손자엔티티, 그리고 증손자엔티티까지 계속해서 상속이되는 속성이고 복잡한 데이터 모델이 구현되어 물리데이터베이스에서 조인으로 인한 성능저하가 예상될 수 있다.
-
주식별자의 속성의 개수가 많을때는(일반적으로 7~8개 이상) 새로운 인조식별자를 생성하여 데이터 모델을 구성하는 것이 좋다.
-
-
식별자관계와 비식별자관계에 따른 식별자
가. 식별자관계와 비식별자 관계의 결정
- 외부식별자는 자기 자신의 엔티티에서 필요한 속성이 아니라 다른 엔티티와의 관계를 통해 자식 쪽에 엔티티에 생성되는 속성을 외부식별자라 하며 데이터베이스 생성 시에 Foreign Key 역할을 한다.
-
자식엔티티에서 부모엔티티로부터 받은 외부식별자를 자신의 주식별자로 이용할 것인지 또는 부모와 연결이 되는 속성으로서만 이용할 것인지를 결정해야 한다.
나. 식별자관계
-
자식엔티티의 주식별자로 부모의 주식별자가 상속이 되는 경우를 식별자관계라고 한다.
다. 비식별자관계
- 부모엔티티로부터 속성을 받았지만 자식엔티티의 주식별자로 사용하지 않고 일반적인 속성으로만 사용하는 경우를 비식별자 관계라고 하며 다음의 네 가지 경우에 비식별자 관계에 의한 외부속성을 생성한다.
- 자식엔티티에서 받은 속성이 반드시 필수가 아니어도 무방하기 때문에 부모 없는 자식이 생성될 수 있는 경우이다.
- 엔티티별로 데이터의 생명주기를 다르게 관리할 경우, 부모엔티티에 인스턴스가 자식의 엔티티와 관계를 가지고 있었지만 자식만 남겨두고 먼저 소멸될 수 있는 경우이다.
-
여러 개의 엔티티가 하나의 엔티티로 통합되어 표현되었는데 각각의 엔티티가 별도의 관계를 가질 때
-
자식엔티티에 주식별자로 사용하여도 되지만 자식엔티티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때 비식별자 관계에 의한 외부식별자로 표현한다.
라. 식별자 관계로만 설정할 경우의 문제점
- 아래와 같이 부모로부터 모두 식별자관계 연결로 인해 PK속성의 개수가 많아진 것을 볼 수 있다.
- 데이터 모델의 흐름이 길어질수록 증가할 수 밖에 없는 구조를 가지게 된다.
마. 비식별자 관계로만 설정할 경우의 문제점
-
아래와 같이 각 엔티티간의 관계를 비식별자 관계로 설정하면 이런 유형의 속성이 자식엔티티로 상속이 되지 않아 자식엔티티에서 데이터를 처리할 때 쓸데없이 부모엔티티까지 찾아가야 하는 경우가 발생된다..
-
아래의 같이 비식별자 관계로 연결된 경우 REPOO7T 엔티티에서 어떤 점검에 대한 정보를 보려고 하면 불필요한 조인이 다량으로 유발되면서 SQL구문도 길어지고 성능이 저하되는 현상이 발생이 된다.
바. 식별자관계와 비식별자관계 모델링
-
비식별자관계 선택 프로세스
- 여기서 가장 중요한 요인은 자식엔티티의 독립된 주식별자 구성이 필요한지를 분석하는 부분이다. 독립적으로 주식별자를 구성한다는 의미는 업무적 필요성과 성능상 필요여부를 모두 포함하는 의미로 이해하면 된다.
-
식별자와 비식별자관계 비교
-
식별자와 비식별자를 적용한 데이터 모델