권순용의 데이터모델링 이야기
서브셋과 수퍼셋 0 0 3,237

by axiom 서브셋 Subset 수퍼셋 Superset [2015.08.13]


데이터 모델링의 핵심 중 하나인 엔티티(Entity)는 서브셋(Subset)과 수퍼셋(Superset)이라는 두 개념을 가지고 있다.

서브셋과 수퍼셋은 모델링의 견고성에 영향이 큰 만큼 이를 이해한다는 것은 무척이나 중요하다. 이 글에서는 서브셋과 수퍼셋의 특징을 살펴보고, 예제를 통해 좀 더 깊이 이해해 보자.

서브셋 엔티티의 의미는 무엇일까? 우선 서브셋 엔티티의 정의에 대해 살펴보자.

계좌 엔티티에 개인 계좌 데이터와 법인 계좌 데이터가 저장된다고 가정하자. 해당 엔티티는 개인 계좌와 법인 계좌라는 2개의 서브셋을 가지게 된다. 이처럼 데이터가 어떤 특정 성격에 의해 구분 가능한 경우 해당 엔티티를 서브셋 엔티티라고 부른다.

이러한 서브셋 엔티티는 다음과 같은 특징을 가진다.

  • [그림 1] 여러 개의 서브셋을 가지는 엔티티의 특징
  •  서브셋(Subset)과 수퍼셋(Superset)

서브셋 엔티티은 2개 이상의 독립적인 서브셋으로 구성해야 한다.

서브셋을 구성할 때에는 교집합이 존재하지 않는 2개 이상의 독립된 형태로 구성해야 한다.

서브셋 간에는 공통된 속성(Attribute)과 관계(Relationship)가 있다.

서브셋은 동질성을 가진다. 따라서 유사한 속성으로 구성된다. 유사한 속성을 가지기 때문에 다른 엔티티와도 유사한 관계를 가진다.

각각의 서브셋은 속성과 관계를 가질 수 있다.

각각의 서브셋은 다른 속성과 관계를 가질 수도 있다. 이처럼 상이한 속성과 관계가 많은 경우 엔티티 분할을 고려할 수 있다.

서브셋 사이에 중복된 데이터가 없어야 한다.

만약 데이터가 중복된 경우 이에 대한 해결이 필요하다. 서브셋간 교집합이 성립할 때 문제가 발생할 수 있기 때문이다. 그러므로 서브셋을 정의할 때 교집합 또는 또 다른 서브셋으로 분리해야 한다.

서브셋과 서브셋 간에는 부모 자식 관계가 존재하지 않는다.

하나의 엔티티에 존재하는 서브셋의 경우 부모 자식 관계가 성립하지 않는다. 예컨대 계좌 엔티티에 개인 계좌 서브셋과 법인 계좌 서브셋이 있다고 가정하자. 과연 어떤 서브셋이 부모 서브셋이 돼야 하는가? 이 둘은 어떠한 관계도 없다. 이처럼 서브셋과 서브셋 사이에는 부모 자식 관계가 존재할 수 없는 것이다.

구분 속성 필요(불분명한 서브셋인 경우 기타로 표시)

여러 개의 서브셋으로 구성된 엔티티는 구분 속성으로 관리해야 한다. 그렇지 않을 경우 하나의 엔티티에서 서로 다른 서브셋을 구분할 수 없다. 서브셋은 구분 속성으로 구별 가능하다. 불분명한 서브셋인 경우 구분 속성을 기타로 표시한다.

서브셋과 수퍼셋

서브셋들이 각각의 엔티티로 구성돼 있는 경우 수퍼셋으로 엔티티를 통합할 수 있다. 이 경우 각각의 서브셋을 구별하기 위한 구분 속성이 필요하다.

  • [그림 2] 수퍼셋
  •  서브셋(Subset)과 수퍼셋(Superset)

예컨대 정규직 엔티티, 아르바이트 엔티티, 계약직 엔티티가 서로 분리돼 있다고 가정하자(<그림 2> 참조).

해당 엔티티들은 유사한 속성을 가졌다면 사원 엔티티를 하나의 수퍼셋으로 구성할 수 있다. 이 경우 하나의 엔티티에 모든 데이터가 저장되기 때문에 구문 속성을 도출해 구별해야 한다. 만약 유사 엔티티를 통합할 경우 SQL이 더욱 간단해질 것이다.

  • [그림 3] 엔티티의 서브셋을 별도의 엔티티로 분리한 예
  •  서브셋(Subset)과 수퍼셋(Superset)

하나의 수퍼셋으로 구성된 엔티티는 필요에 따라 각각 서브셋을 별도의 엔티티로 분리할 수 있다. 이처럼 서브셋을 별도의 엔티티로 도출하면 엔티티 분할에서 언급했듯 유연성이 높아지지는 이점이 있지만 SQL이 복잡해질 수 있다. 수퍼셋과 서브셋의 특징은 다음과 같다.

  • [그림 4] 서브셋과 수퍼셋의 특징
  •  서브셋(Subset)과 수퍼셋(Superset)

베타적

서브셋들은 서로 교집합이 존재하면 구현이 어렵고 복잡해진다. 만약 서브셋들이 베타적일 뿐 아니라 교집합까지 있을 경우 교집합 자체를 하나의 서브셋으로 도출할 수 있다.

서브셋은 하나의 수퍼셋에 포함됨

서브셋은 하나의 수퍼셋에만 포함돼야 한다. 만약 서브셋이 여러 개의 수퍼셋에 포함될 경우 이는 엔티티 도출이 잘못될 가능성을 높인다. 즉 중복된 데이터가 존재할 가능성이 높다.

구분 속성 필요

하나의 엔티티로 구성된 수퍼셋에서 필요에 의해 서브셋 데이터만 추출해야 할 경우 해당 엔티티에는 구분 속성이 필요하다. 이 구분 속성을 통해 필요한 서브셋의 데이터만 추출할 수 있다.

서브셋의 깊이(Depth)는 1까지 구현

한번 구분한 서브셋을 다시 한번 서브셋으로 분리해서는 안 된다. 또한 하나의 수퍼셋은 한번만 서브셋으로 분리하고 구성해야 한다. 서브셋의 깊이가 깊어지면 구성이 복잡해지므로 해당 엔티티를 액세스하는 SQL 또한 복잡해지기 때문이다.

수퍼셋 : 서브셋 = 1:n

하나의 수퍼셋은 여러 개의 서브셋을 가질 수 있다. 만약 수퍼셋 : 서브셋 = 1:1이라면 서브셋 존재의 의미가 없다.

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

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

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

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