표준 SQL 및 데이터베이스 입문
식별자 다음은 구분코드에 대해 생각해 봅시다. 구분코드란, 예를 들어, 고객을 법인과 개인으로 구분하여 관리할 때 사용하는 코드를 말합니다. 학원의 경우, 언젠가는 고등핛행용 교육코스도 고려하고 있으니 그떄 사용할 수 있습니다. 이런 느낌입니다. 이 구분코드는 슈퍼타입과 서브타입이 있습니다.
슈퍼타입이란? 상위개념이라는 뜻입니다. 예를 들어, 개인고객과 법인고개의 상위개념은 '고객'입니다. 즉 보다 일반화하여 파악한 것이 슈퍼타입니다.
고객 엔티티 내에 개인과 법인을 구분하기 위한 구분코드가 있다면, 고객 엔티티에는 개인고객과 법인고객이라는 서브타입이 포함되어 있다는 것을 알 수 있습니다. 즉, 고객이 슈퍼타입이고, 개인고객과 법인고객이 서브타입니다.
서브타입에 따라 필요한 속성항목이 다를 수 있습니다. 예를 들어, 개인과 법인의 경우 관리해야 할 사항이 상당히 다릅니다. 그래서 하나의 테이블에서 모두 관리해도 되는지, 아니면 별도로 분리하는 것이 실제 상황에서 더 적합한지를 고민해야 합니다.
반대로 별도의 테이블로 관리하고 있었지만, 사실은 같은 테이블에서 관리하는 것이 적절한 경우도 있을 수 있습니다. 슈퍼타입과 서브타입이라는 관점에서 데이터를 보면, 새로운 문제에 직면할 수 있다는 것입니다. 슈퍼타입과 서브타입은 원래 객체지향 모델에서 사용되던 개념(ER모델이나 관계모델과는 별개의 모델)인데 데이터베이스 설계에도 유용하기 때문에 ER다이어그램에서도 표현할 수 있도록 새로운 표기법이 만들어졌습니다.
참고로, '개인고객은 고객이다'와 '법인고객은 고객이다'라는 사실은 객체지향 용어로 is-a 관계라고 하며, '고객은 개인 고객 또는 법인 고객이다'라는 것은 or 관계라고도 합니다. 조금더 살펴보면, 구분코드를 가진 엔티티는 내부에 '고객은 개인고객과 법인고객으로 구분된다' 또는 '개인 고객과 법인고객을 합쳐서 고객이라고 부른다'와 같은 계층구조를 가지고 있습니다. 이때 상위 즉 보다 추상화된 엔티티를 슈퍼타입(supertype), 하위, 보다 구체화된 엔티티를 서브타입(subtype)이라고 합니다. 또한 슈퍼타입을 서브타입으로 분리하는 것을 '특화(specialization)'라고 하고, 반대로 서브타입을 슈퍼타입을 통합하는 것을 '범화(generalization)'이라고 합니다.
슈퍼타입과 서브타입
엔티티 내에 계층구조가 있는 경우, 우선 구분별로 엔티티를 만들어서 어떤 관계가 형성되어 있는지, 적절한 구분코드가 적용되어 있는지를 확인할 필요가 있습니다. 또한, 분산된 엔티티들을 살펴보면 슈퍼타입을 간과하고 있지 않은지도 검토해야 합니다.
ER다이어그램에서는 아래와 같이 슈퍼타입과 서브타입을 나타냅니다.
슈퍼타입과 서브타입 (IE기법과 IDEF1X기법에 의한 예시)
구분코드의 뒤에는 슈퍼타입과 서브타입이 있다는 것을 알게 되었습니다. 그리고 구분코드를 찾았다면 그 구분코드가 슈퍼타입과 서브타입이 is-a관계에 있는지를 체크해야 합니다.
두 엔티티가 슈퍼타입과 서브타입 관계라면, 서브타입 쪽 엔티티의 데이터는 모두 슈퍼타입 엔티티에 포함되어 있어야 합니다. 이를 is-a관계라고 합니다.
슈퍼타입과 서브타입은 is-a의 관계
개인고객과 고객의 경우라면, '개인고객(서브타입) is a 고객(슈퍼타입)'입니다. 하지만 위와 같이 '자동차'와 '자전거'에 대해 '자동차'를 슈퍼타입, '자전거'를 서브타입으로 간주한다면, 엔티티를 바라보는 방식을 재고할 필요가 있습니다. 즉, '자동차'가 아니라 '탈것'이나 '통근수단'이라는 관점에서 다시 정리하면 잘 될 가능성이 있습니다. 또는 별개의 엔티티로 다루는 것이 더 적절할 수도 있습니다.
그리고 서브타입들 간에 or관계가 형성되어 있는지도 확인해야 합니다. 즉, 겹치면 안된다는 것입니다. 서브타입에 주목하면 하나의 데이터는 반드시 하나의 서브타입에만 포함되어야 하는 관계여야 합니다. 이것을 or관계라고 합니다. 예를 들어, 고객은 개인 또는 법인이어야 하며, '개인고객이면서 동시에 법인고객이다'라는 경우는 없어야 합니다. 하지만, 엔티티에 따라 or관계가 성립되지 않은 경우도 있습니다. 이 경우에는 or관계가 성립하도록 구분코드를 재검토해야 합니다.
서브타입끼리는 or의 관계
슈퍼타입과 서브타입이 잘 정리되면, 슈퍼타입으로 테이블을 만들지, 서브타입으로 테이블을 만들지 고민하게 됩니다. 여기서는 정해진 답이 없다는 것입니다.
서브타입들끼리 얼마나 유사한지, 즉 같은 속성을 가지고 있는지와 같이, 같이 사용하는 빈도가 중요합니다. 서브타입과 서브타입 중 어느 것으로 테이블을 생성해야 할지는 상황에 따라 다릅니다. 핵심은 함꼐 사용하는 빈도가 높은지, 그리고 속성 항목들이 어느 정도 동일한지 2가지입니다.
함꼐 사용하는 빈도가 낮은 엔티티는 별도의 테이블로 분리하는 것이 처리효율을 높입니다,. 애초에 같이 사용하지 않는다면 별도로 관리되는 것이 사용하기 편리하다고 볼 수 있습니다. 또한, '정직원과 파트타임 직원'과 같이, 직원이라는 관점에서는 동일한 엔티티이더라도 속성 항목이 크게 다르다면, 일반적으로 별도의 엔티티로 분리합니다. 이는 NULL항목이 많아지는 것을 피하기 위함입니다.
이렇게 재검토하다보면, 놓쳤던 속성을 찾아내거나, 실제로 필요없었던 속성을 인지할 수 있습니다. 참고로 DBMS용 GUI도구 중에도 테이블간의 참조관계를 ER다이어그램으로 표시할 수 있는 도구들이 있으니 Navicat이나 DBeaver를 활용해 보시기 바랍니다.
<공지사항>
완료된 강좌는 아닙니다. 브런치가 최대 하나의 책을 쓰는데 챕터가 30개까지만 작성이 가능해서
표준 SQL 및 데이터베이스 입문1 <2025년 2월 공개 완료>
표준 SQL 및 데이터베이스 입문2 <2025년 3월말에서 4월 공개 예정>
남은 목차는 아래와 같습니다.
[데이터조작] 30. SELECT의 기본구문
[데이터조작] 31. 함수와 연산자
[데이터조작] 32. NULL과 UNKNOWN
[데이터조작] 33. 조인(JOIN)
[데이터조작] 34. 테이블 연결(UNION)
[데이터조작] 35. 집계함수
[데이터조작] 36. CASE 식
[데이터조작] 37. 서브쿼리
[데이터조작] 38. 테이블 공통(INTERSECT)와 차이(EXCEPT)
[데이터조작] 39. 윈도우 함수
[데이터조작] 40. 데이터 업데이트
[데이터조작] 41. 트랜젝션 처리
[데이터조작] 42. 관계 연산
[실무예제] 43.학원 데이터베이스 설계
[실무예제] 44. 교육 정보
[실무예제] 45. 학생별 정보 추출과 데이터성형
[실무예제] 46. 복잡한 조건에 합치하는 학생 추출
표준 SQL 및 데이터베이스 입문
읽어주신 독자분들께 감사드립니다.
©2024-2025 GAEBAL AI, Hand-crafted & made with Damon Jaewoo Kim.
GAEBAL AI 개발사: https://gaebalai.com
AI 강의 및 개발, 컨설팅 문의: https://talk.naver.com/ct/w5umt5