본문 바로가기
Database

데이터 모델링 식별자

by oncerun 2021. 4. 23.
반응형

식별자

 

식별자는 하나의 엔티티에 구성된 여러 속성을 대표하는 속성입니다. 보통 이때 식별자와 PrimaryKey를 동일하게 생각하는데, 이 식별자는 업무적으로 구분이 되는 정보이고 논리적 데이터 모델링을 할 때 지정됩니다.

반면에 Key는 데이터베이스 테이블에 접근을 하기 위한 매개체로 물리적 데이터 모델링을 할 때 사용됩니다.

 

주 식별자의 특징을 간단히 말하면, 유일성, 최소성, 불변성, 존재성 이 있습니다.

한마디로 정리하면 주식 별자는 집합에서 유일해야 하고 최소 개의 속성으로 이루어져야 하고, 변하지 않는 값이 여야 하며, 반드시 존재해야 합니다.

 

주식 별자를 도출할 때는 어떤 기준으로 도출해야 할까요?

 

1. 해당 업무에서 자주 이용되는 속성

2. 이름으로 기술되는 것은 가능하면 지정하지 않습니다.

3. 복합으로 주식 별자를 구성할 경우 너무 많은 속성을 담지 않습니다.

 

식별자 관계와 비식별자 관계에 따른 식별자

 

* 외부 식별자란 자기 자신의 엔티티에서 필요한 속성이 아닌 다른 엔티티와의 관계를 통해 자식 쪽에 생성되는 속성을 외부 식별자라 하며, 물리적 데이터 모델링 시 Foreign Key 역할을 하게 됩니다.

관계와 속성을 정의할 때 논리적 관계에 의해 자연스럽게 외부 식별자가 도출되지만 고려야 해 할 상황이 존재합니다.

대부분은 부모 주식 별자를 자식 엔티티 속성으로 내려보냅니다. 이 경우 자식 엔티티에서 전달받은 외부 식별자를 자신의 주식 별자로 사용하거나 또는 부모와 연결 속성으로만 이용할지 결정합니다.

 

1. 식별 관계

 - 전달받은 외부 식별자를 자식이 주식 별자로 이용하는 경우로 Null 값이 존재할 수 없기에 부모의 생성 이후에 자식이 생성됩니다.

 

2. 비식별 관계

 - 부모 엔티티로 속성을 받았지만 자식 엔티티의 주식 별자로 사용하지 않고 일반 속성으로 사용하는 경우를 비식별 관계라고 합니다.

 

실제 프로젝트에서도 둘 중 무엇이 좋은지 많은 생각을 해야 합니다. 높은 경험치를 요구하고 상황에 맞게 사용합니다.

 

기본적으로 식별자 관계로 모든 관계를 구성하면서 다음 조건일 때 비식별자 관계로 조정하면 됩니다.

 

1. 관계의 강도가 약할 때 (즉 해당 엔티티와의 연결이 자주 없을 때)

2. 자식이 독립적으로 PK가 필요한 경우

3. SQL 내부 복잡도가 증가할 경우

 

* 독립적으로 주식 별자를 구성한다는 의미는 업무적 필요성과 성능상 이점을 모두 포함합니다.

 

비식별자 관계로 조정한 경우 4가지의 비식별자 관계에 의한 외부 속성을 생성하게 됩니다.

 

1. 자식 엔티티에서 받은 부모의 주식 별자 속성이 반드시 필수가 아니어도 무방하기 때문에 부모 없는 자식이 생성될 수 있다. (FK제약조건을 생각하지 않으셔야 합니다. 그건 물리적 데이터 모델링이며 강 결합을 뜻합니다.)

 

2. 엔티티 별 데이터의 생명주기를 다르게 할 경우 부모가 먼저 소멸되고 자식만 남을 수 있습니다.

 

3. 여러 개의 엔티티가 통합되어 주식 별자가 사라져 강제적 비식별자 관계가 되는 경우가 있습니다. 통합되기 전 엔티티를 부모로 삼는 자식 엔티티들과 연결되었던 부모 주식 별자가 전부 통합되어 다른 주식 별자로 사용되면 자동적으로 비식별자 관계가 되어버리는 경우라고 할 수 있습니다.

 

4. 자식 엔티티에서 별도의 주식 별자를 생성하는 것이 더 유리할 때

 

 

귀찮아서 비식별자 혹은 식별자 관계로 단방향으로 관계를 설정한 경우 어떤 문제가 있는지 알아보겠습니다.

 

 

식별자 관계로만 설정한 경우

 

이 경우는 끔찍하게 긴 SQL문을 경험할 수 있습니다. 바로 주식 별자의 전파 때문인데요. 대구 1:N 관계에서 N은 자식 엔티티에 주식 별자를 전파합니다. 이러한 관계가 이어질 경우 식별자 관계만 사용했을 때 최상위 부모의 키가 후손의 주식 별자까지 전파가 되어 많은 속성을 주식 별자로 사용하는 후손 엔티티가 생성됩니다.

 

그럼 후손 엔티티를 조회하거나 조인할 때를 생각해 보면 기본적으로 WHRER 절에 속성 값만큼 들어가야 한 다는 것을 알 수 있습니다.

 

비식별 관계로만 설정하면 문제점이 없을까?

 

비식별 관계시 자신 엔티티는 부모 PK를 속성으로 가지고 있는 경우가 많은데 자식 엔티티에서 데이터를 처리할 경우 여러 엔티티를 탐색하여 올라가야 하는 일이 발생한다.

 

즉 부모의 부모의 부모로 JOIN문을 통해 올라가야하는 일이 발생해 직접 접근을 하지 못하게 된다.

많은 JOIN문은 성능 문제를 야기할 수 있으며 개발자의 실수가 발생할 수 있는 부분이다.

 

*ERD에서는 비식별자를 점선으로 표현하며 식별자관계를 실선으로 처리한다

반응형

'Database' 카테고리의 다른 글

데이터 모델링 정규화의 성능  (0) 2021.04.23
성능 데이터 모델링  (0) 2021.04.23
데이터 모델링 (2)  (0) 2021.04.22
데이터 모델링 (1)  (0) 2021.04.21
[DB] 설계 실습  (0) 2021.04.13

댓글