본문 바로가기

데이터베이스(DA, AA, TA)

[데이터베이스] 아는만큼 보이는 테이터베이스(2) - 식별자관계와 비식별자 관계 설정

식별자관계와 비식별자 관계 설정


데이터모델링에서 엔티티타입 간의 관계를 설정하면서 부모의 PK 속성이 자식의 PK 속성으로 가야하는지, 일반 속성으로 가야하는지 논리적으로 결정하는 것은 여러가지 관점에서 중요합니다.



식별자/비식별자 관계를 잘모르고 데이터 모델링을 진행한다면?

 - 식별자관계만을 이용하여 데이터 모델링을 전개할 경우, PK 속성의 숫자가 증가할수록 관련된 SQL 구문이 복잡해져 복잡성으로 인한 개발 오류를 유발하게 된다.

 - 비식별자관계만을 이용하여 데이터모델링을 전개할 경우, 테이블 간의 과다한 조인을 유발하여 조인에 의한 성능 저하를 불러오게 된다.


데이터모델관계 도출시 식별자관계와 비식별자관계의 의미를 정확하게 이해하고 업무적 특징, 조인관계, PK 구성을 고려하여 식별자관계/비식별자관계를 결정한다.


두 엔티티타입 사이의 관계의 유형은 업무, SQL, 자식테이블의 PK 구성 전략에 의해 결정됩니다.



PK 속성이 너무 많은 경우는?

자주 이용하는 테이블의 PK 컬럼의 수가 5개가 되다보니 비슷한 유형의 테이블을 세개만 조인을 해도 WHERE 절에 무려 15개의 컬럼 조인항목이 발생합니다. 관계 설정시, 식별자관계와 비식별자관계를 조정하지 않고 단지 식별자관계만 연결하여 테이블 PK수가 증가하는 경우가 발생하게 됩니다.



* 식별자 관계로만 설정하면?

테이블간 관계를 통해 PK 구조가 영향 받을 수 있습니다. 부모 테이블에는 PK 속성의 수가 1개이고 관계가 1:M으로 전개된다면 자식테이블의 PK 속성 수는 부모테이블의 PK 속성수 + 1이 성립됩니다. 1개이상의 속성이 추가되어야 1:M 관계를 만족할 수 있습니다.


  원 부모테이블 : 1개

  2대 부모테이블 : 2개 이상 = 원부모 1개 + 추가 1개 이상

  3대 부모테이블 : 3개 이상 = 원부모 1개 + 2대 1개 + 추가 1개 이상

  4대 부모테이블 : 4개 이상 = 원부모 1개 + 2대 1개 + 3대 1개 + 추가 1개 이상

  5대 부모테이블 : 5개 이상 = 원부모 1개 + 2대 1개 + 3대 1개 + 4대 1개 + 추가 1개 이상

  ...


이와 같은 규칙에 의해 지속적으로 식별자관계를 연결한 데이터모델의 PK 속성수가 데이터 모델의 흐름이 길어질수록 증가하는 구조가 생겨났습니다.


식별자관계만으로 연결된 데이터 모델은 PK 속성이 지속적으로 증가할 수밖에 없는 구조로서 개발 복잡성과 오류 가능성을 유발할 수 있습니다.



* 비식별자 관계로만 설정한다면?

보통 간단한 조회 조건에 대해서도 기본적으로 3~4개의 조인이 걸릴수 밖에 없는데 SQL 문장 자체에 조인이 많은 경우, 대량 데이터 적재 후에는 성능이 나오기 어렵습니다.


일반적으로 각각의 테이블에는 중요한 기준 속성이 존재합니다. 이 기준 속성은 부모 엔티티타입에 있는 PK 속성으로부터 상속되어 자식 엔티티타입에 존재하는 경우가 많이 있습니다.


이러한 속성은 부모 테이블 조회뿐 아니라, 자식테이블의 데이터 조회에서도 해당 조건이 조회의 조건으로 걸리는 경우가 많습니다. 그런데 데이터 모델링을 전개할때 각 엔티티타입 간의 관계를 비식별자관계로 설정하면, 이런 유형의 속성이 자식 테이블로 상속되지 않아 자식 테이블에서 데이터를 처리할 때 쓸데없이 부모테이블까지 찾아가야하는 경우가 생겨합니다.


1) 비식별자 관계

SELECT A.기본가중치, A.조정가중치
FROM REPO07T A, REPO05T B, REPO01T C
WHERE A.분야번호 = B.분야번호
    AND B.점검번호 = '301';

2) 식별자 관계

SELECT A.기본가중치, A.조정가중치
FROM REPO07T A
WHERE A.점검번호 = '301';


* 비식별자관계를 선정하는 기준

실제로 프로젝트를 전개할때 식별자관계와 비식별자관계를 취사선택하여 연결하는 기술은 높은 내공을 필요로합니다. 특히 식별자관계에서 비식별자관계를 파악하는 기술이 필요합니다. 다음 Flow에 따라 비식별자 관계를 선정하면 합리적으로 관계를 설정할 수 있습니다.



자식 테이블의 독립된 PK 구성이 필요한지를 분석하는 부분이 가장 붕요합니다. 독립적으로 PK를 구성한다는 의미는 업무상 필요성과 성능상 필요성 여부를 모두 포함하는 의미로 이해하면 합니다.


업무적 특성에 따라 식별자/비식별자 관계를 연결함으로써 PK의 특징도 살릴수 있고 SQL 조회의 효율도 향상시킬 수 있습니다.