권순용의 데이터모델링 이야기
관계의 구성요소를 이해하자 0 0 2,834

by axiom 관계 Relationship 릴레이션 Selectivity Cardinalty [2015.08.13]


관계는 엔티티를 이어주는 데이터 모델링의 요소로, 데이터 모델을 해석하고 데이터의 연관관계를 표현하는데 쓰인다.

관계가 없는 데이터 모델은 잘못된 것이다. 관계의 구성에 따라 데이터의 정합성도 강화할 수 있다.

지난 시간에는 관계의 구성요소로 Selectivity와 Cardinality가 있다고 언급한 바 있다. 이에 이 두 관계에 대해 보다 자세히 살펴보는 시간을 마련했다.

관계의 Selectivity

  • [그림 1]
  • 관계의 구성요소를 이해하자

<그림 1>의 카드 엔티티에 옆에 그려진 수직선은 Mandatory를 의미하는데, 여기서 Mandatory는 ‘필수’를 뜻한다. 이 수직선에는 동그라미가 없음에 유의하자.

그 방향이 거래내역 엔티티에서 카드내역 엔티티를 방향하고 있기 때문에 1개의 Unique Identifier의 값에 대한 거래내역 엔티티에는 반드시 하나의 데이터가 존재한다. 반면 거래내역 엔티티에 표시된 동그라미와 하나의 수직선은 Optional을 뜻한다.

Optional은 필수가 아닌 선택을 의미한다. 여기서는 방향이 카드 엔티티에서 거래내역 엔티티를 향하기 때문에 1개의 카드 엔티티가 가진 Unique Identifier의 값은 거래내역 엔티티에 존재하거나 존재하지 않아도 된다.

이러한 관계에서 만약 서브쿼리로 SQL을 작성해야 한다면 Optional을 가지고 있는 엔티티와 서브쿼리에 Mandatory를 가진 엔티티가 주 쿼리에 존재해야만 해당 SQL이 의미가 있게 된다.

반대의 경우 Mandatory를 가지는 엔티티가 서브쿼리로 설정되면 이는 항상 만족하기 때문에 의미가 없다. 그러므로 이러한 점에 주의해서 SQL을 작성할 필요가 있다.

관계의 Cardinalty

관계를 구성하는 구성요소 중 하나인 Cardinality에는 다음과 같은 세 가지 종류가 있다.

  • - M:1 - Many To One
  • - M:M - Many To Many
  • - 1:1 - One To One

이 중 1:1 관계를 먼저 살펴보면 그 정의는 1:1 양쪽 방향에 Mandatory를 가진다고 할 수 있다. 그렇다면 1:1 관계의 속성은 어떻게 될까?

  • [그림 2]
  • 관계의 구성요소를 이해하자

수직 분할

1:1 관계에 있는 2개의 엔티티는 일반적으로 하나의 엔티티지만, 어떤 이유로든 수직 분할이 된 경우가 대부분이다. 즉 그 태생은 하나의 엔티티라고 볼 수 있다.

하나의 엔티티로 구성해도 무방

태생이 같은 엔티티이므로 하나의 엔티티로 구성해도 무방하다.

시스템에 1:1 관계가 많다면 1:1 관계의 재점검이 요구됨

일반적인 1:1 관계는 데이터 장합성과 성능 저하를 발생시킬 가능성이 있으므로 이러한 부분을 중점으로 재검토해야 한다.

빈번한 조인이 발생할 경우 성능이 저하됨

1:1 관계로 엔티티를 도출하고 빈번하게 조인을 수행할 경우 랜덤 엑세스가 자주 발생해 성능이 저하된다. 따라서 이러한 현상이 발생할 때에는 엔티티의 통합을 고려해야 한다.

데이터 정합성의 위험

태생이 같은 데이터를 수직 분할하면 서로 다른 엔티티에 분리 저장되기 때문에 데이터 정합성이 위험해질 수 있다. 따라서 주기적인 대사 작업 등이 필요해지므로 이로 인한 추가적인 부하가 가중될 수 있다.

이처럼 1:1 관계는 데이터 정합성과 성능 저하라는 두 가지 단점을 야기시킬 수 있다. 그렇다면 어떠한 경우에 1:1 관계를 사용해야 할까?

수직 분할 후에 데이터 정합성도 민감하지 않으며, 두 엔티티 간에 조인이 발생하지 않는 경우가 적합하다.

이런 점에 주의해서 1:1 관계를 구현하자. 1:1 관계는 Selectivity에 의해 여러 가지 유행이 있을 수 있다. 지금부터는 1:1 관계의 유형에 대해 살펴본다(<그림 3> 참조).

  • [그림 3]
  • 관계의 구성요소를 이해하자

① 양쪽 엔티티는 Mandatory 관계이므로 완전한 수직 분할이라고 볼 수 있다. 엔티티 통합에 어떠한 문제도 없는 상태다.

② 한쪽 엔티티만 Optional 관계이므로 민원 요청 엔티티의 데이터 중 민원인 엔티티에 데이터가 존재하지 않을 수도 있다. 엔티티를 통합하게 되면 민원인 엔티티가 더 작을 수 있으므로 민원요청 엔티티에 민원인 엔티티가 포함된다. 이 같은 구조를 보통 1:1 OR 0의 관계라고 한다. 해당 엔티티를 조인하는 SQL에는 Outer 조인이 많이 사용되는 특징이 있다. 그러므로 두 엔티티에 조인이 많이 발생한다면 엔티티 통합을 고려해야 할 것이다.

③ 두 엔티티에 Optional의 관계가 존재하는 경우다. 이런 경우는 드물지만 해당 엔티티를 조회하는 SQL에는 양쪽 Outer 조인이 발생하기 쉬워 성능 저하가 일어날 수 있다. 해당 관계는 가장 주의해야 할 관계 중 하나인데, 해당 엔티티들이 자식 엔티티를 가질 경우 더욱 복잡해질 수 있기 때문이다. 물론 1:1 관계이므로 데이터 정합성도 위험해질 수 있다.

- 강좌 URL : http://www.gurubee.net/lecture/2874

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입