권순용의 데이터모델링 이야기
관계의 종류를 이해하자 0 0 99,999+

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


지난 시간에 이어 이 글의 주제도 ‘관계’다. 관계는 엔티티 사이의 연관성을 의미하는 RDMBS에서 매우 중요한 요소다. 여러 가지의 관계 중 대표적인 관계에는 무엇이고 그 특징은 무엇인지 살펴본다.

관계의 형태는 다양하다. 관계의 종류에 따라 엔티티에 저장되는 데이터의 형태가 찬차만별이기 때문이다. 이러한 관계의 여러 형태 중에서도 1:M 관계, 1:1 관계, M:M 관계에 대해 이해하는 시간을 준비했다.

1:M 관계

1:M 관계는 Selectivity에 의해 여러 가지 유형이 존재한다. 먼저 1:M 관계의 유형을 나타낸 <그림 1>을 살펴보자. 여기서 카드 엔티티는 부모 엔티티이며, 거래내역 엔티티는 자식 엔티티의 관계에 있다.

  • [그림 1] 1:M 관계
  • 관계의 종류를 이해하자

① 가장 이상적인 관계다. 자식 엔티티인 거래내역 엔티티의 데이터는 부모 엔티티인 카드 엔티티의 데이터에 의해서만 생성되는 형태를 띄고 있다.

② 부모 데이터 없이 자식 데이터가 생성될 수 있는 형태다. 이러한 형태는 참조 테이블에서 발생하는 관계인데, 흔치 않은 관계라고 볼 수 있다.

③ 자식 엔티티의 데이터에 의해 부모 데이터가 생성되는 형태로 이 또한 흔하지 않다.

1:1 관계

Cardinality의 종류 중 하나인 1:1 관계는 양쪽에 대해 Mandatory를 의미한다.

  • [그림 2] 1:1 관계
  • 관계의 종류를 이해하자

수직 분할

1:1 관계에 있는 2개의 엔티티는 일반적으로 하나의 엔티티지만 어떤 이유에서든 수직 분할된 경우가 대부분이다. 결국 태생은 하나의 엔티티인 것이다.

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

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

시스템에 1:1 관계가 많다면 1:1 관계에 대한 재점검 필요

일반적인 1:1 관계는 데이터의 정합성과 성능 저하를 발생시킬 가능성이 크므로 이에 대한 재점검이 필요하다.

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

1:1 관계로 엔티티를 도출하고 빈번하게 조인을 수행한다면 이는 랜덤 액세스 증가로 성능 저하를 발생시키게 된다. 따라서 이와 같은 현상이 많이 발생한다면 엔티티의 통합을 고려해야 한다.

데이터 정합성의 위험

태생이 같은 데이터를 수직 분할했기 때문에 서로 다른 엔티티에 분리돼 저장돼 데이터 정합성이 위험해질 수 있다. 따라서 주기적인 대사 작업 등이 필요할 수 있을 뿐 아니라 이로 인해 부하가 발생할 수 있다.

이처럼 1:1 관계는 데이터 정합성과 성능 저하라는 두 가지 문제를 발생시킬 수 있다. 그렇다면 어떤 경우에 1:1 관계를 형성되는 것일까?

수직 분할 후에 데이터 정합성도 민감하지 않으며 두 엔티티간에 조인이 발생하지 않는 경우에 사용하는 것이 바람직하다. 이러한 점을 주의하며 1:1 관계를 구축해야 한다.

M:M 관계

M:M 관계 또한 자주 발생하는 관계다. M:M 관계의 속성을 확인해보자.

조인 발생시 GROUP BY 사용

M:M 조인을 수행하면 그 결과가 M*M 형태의 데이터가 추출된다. 원하는 데이터를 추출하기 위해서는 GROUP BY를 사용해야 하며, 이로 인해 성능 저하가 발생할 수 있다.

조인 횟수 증가로 성능 저하

M:M 조인을 수행하면 조인 이후 증가된 데이터가 GROUP BY에 의해 감소된다. 따라서 조인 횟수는 증가하게 되며, 이로 인해 성능 저하가 일어날 수 있다.

자식 엔티티와 조인 시 성능 저하 발생
  • [그림 3] M:M 관계
  • 관계의 종류를 이해하자

<그림 3>에서 고객 엔티티의 자식 엔티티와 상품 엔티티가 조인되면 고객 엔티티와도 조인을 수행하므로 이 또한 GROUP BY를 사용하게 된다. GROUP BY는 정렬을 발생시키므로 성능 저하가 발생할 수 있다.

교차 엔티티 도출 필요

두 엔티티간 조인이 자주 발생하거나 자식 엔티티가 생기는 등의 조인 상황에서는 성능 저하나 추출할 데이터의 정확성을 위해 교차 엔티티를 도출해야 한다.

지금까지 관계의 종류에 대해 살펴봤다. 다음 시간에는 관계의 도출에 대해 보다 자세히 살펴본다.

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

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

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

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