식별자란?
- 여러 개의 집합체에서 각각을 구분할 수 있는 논리적인 이름이 있어야 한다. 이 구분자를 식별자라고 한다.
- 엔티티내의 각 인스턴스를 개별적으로 식별하기 위해 사용된다.
- id, key
식별자의 특징
- 유일성: 주식별자에 의해 엔티티내의 모든 인스턴스들이 유일하게 구분되어야 한다.
- 최소성: 주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 한다. (사원번호만으로 구분가능한 경우, 분류코드+사원번호로 식별자가 구성될 경우 부적절함)
- 불변성: 지정된 주식별자의 값은 자주 변하지 않는 것이어야 한다.
- 존재성: 주식별자가 지정이 되면 반드시 값이 들어와야 한다.(사원번호가 없는 직원은 있을 수 없음, not null)
식별자의 분류
식별자 도출 기준
- 해당 업무에서 자주 이용되는 속성을 주식별자로 지정
- 명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않는다.
- 복합으로 주식별자로 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.
식별자관계와 비식별자 관계의 결정
- 외부 식별자는 자기 자신의 엔티티에서 필요한 속성이 아니라 다른 엔티티와의 관계를 통해 자식 쪽 엔티티에 생성되는 속성을 외부식별자라 하며 데이터베이스 생성 시에 외래키(Foreign Key)역할을 한다.
- 자신엔티티에서 부모엔티티로부터 받은 외부식별자를 자신의 주식별자로 이용할 것인지(식별자 관계) 또는 부모와 연결이 되는 속성으로서만 이용할 것인지(비식별자 관계) 결정해야한다.
식별자 관계
- 자식엔티티의 주식별자로 부모의 주식별자가 상속이 되는 경우를 식별자 관계(Identifying Relationshop)라고 지칭한다.
- 부모로부터 받은 식별자를 자식엔티티의 주식별자로 이용하는 경우는 Null값이 오면 안되므로 반드시 부모엔티티가 생성되어야 자기 자신의 엔티티가 생성되는 경우이다.
비식별자 관계
- 부모 엔티티로부터 속성을 받았지만 자식엔티티의 주식별자로 사용하지 않고 일반적인 속성으로만 사용하는 경우가 있다. 이와 같은 경우를 비식별자 관계라고 하며 다음의 네 가지 경우에 비식별자 관계에 의한 외부속성을 생성한다.
- 자식엔티티에서 받은 속성이 반드시 필수가 아니어도 무방하기 때문에 부모 없는 자식이 생성될 수 있는 경우이다.
- 자식엔티티에 주식별자로 사용하여도 되지만 자식엔티티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때 비식별자 관계에 의한 외부식별자로 표현한다.
식별자 관계로만 설정할 경우의 문제점
- 지속적으로 식별자 관계를 연결한 데이터 모델의 PK속성의 수는 데이터 모델의 흐름이 길어질수록 증가할 수 밖에 없는 구조를 가지게 된다.
- 개발자가 개발할 때 당연히 데이터 모델을 참조하면서 엔티티와 관계를 이용하여 개발해야 하는데 생성된 엔티티 스키마정보만을 보고 개발하는 경우가 많다.
- 조인에 참여하는 주식별자속성의 수가 많을 경우 정확하게 조인관계를 설정하지 않고 즉, 누락하여 개발하는 경우가 간혹 발견되기도 한다.
- 정리하면 식별자 관계만으로 연결된 데이터 모델의 특징은 주식별자 속성이 지속적으로 증가할 수 밖에 없는 구조로서 개발의 복잡성과 오류가능성을 유발시킬 수 있는 요인이 될 수 있다
식별자관계와 비식별자관계
- 실제로 프로젝트를 전개할 때 식별자관계와 비식별자관계를 취사선택하여 연결하는 내공은 높은 수준의 데이터모델링의 기술이라 할 수 있다. -> 연결하더라도 어느순간에 끊을 것인가
- 식별자관계에서 비식별자관계를 파악하는 기술이 필요한데 다음 흐름에 따라 비식별자 관계를 선정한다면 합리적으로 관계를 설정하는 모습이 될 수 있다.
- 기본적으로 식별자관계로 모든 관계가 연결되면서 다음 조건에 해당할 경우 비식별자 관계로 조정하면 된다.
- 웬만하면 비식별자관계로 가는 것이 나을 수도있다. 실무에서는 각테이블별 PK는 필수이다.
식별 관계 과 비식별관계의 장단점(비식별관계는 장단점을 반대로하면된다.)
- 장점
- 기본 키 인덱스를 활용하기 좋다.
- 상위 테이블의 기본 키 컬럼을 자식, 손자 테이블이 가지고 있으므로 특정 상황에 조인 없이 검색이 가능하다.
- 기본 키 인덱스를 활용하기 좋다.
- 단점
- 부모 테이블의 기본 키를 자식 테이블로 전파하면서 자식 테이블의 기본 키 컬럼이 점점 늘어난다.
- 부모 테이블은 1개, 자식 테이블은 2개, 손자 테이블은 3개, ....과 같은 상황에서 조인할 때 SQL이 복잡해지고 기본 키 인덱스가 불필요하게 커질 수 있다.
- 기본 키로 비즈니스 의미가 있는 자연 키 컬럼을 사용한다.
- 비즈니스 요구가 바뀌면 엄청난 코드 수정이 필요하다.
- 테이블 구조가 유연하지 않다.
- 일대일 관계를 제외하고 별도의 복합 키 클래스를 만들어야 한다.
- 부모 테이블의 기본 키를 자식 테이블로 전파하면서 자식 테이블의 기본 키 컬럼이 점점 늘어난다.
JPA에서의 식별자,비식별자 관계 참고 글: https://steady-coding.tistory.com/539
'Computer Science > 데이터베이스' 카테고리의 다른 글
정규화와 성능 (0) | 2023.06.08 |
---|---|
성능 데이터 모델링 (0) | 2023.06.07 |
관계(Relationship) (0) | 2023.06.03 |
속성(Attribute) (1) | 2023.06.03 |
엔티티(Entity) (0) | 2023.06.03 |