-
[SQL 전문가 가이드] 1과목 - 제 7장. 관계(Relationship)와 조인(Join)의 이해데이터베이스(DataBase)/SQL 전문가 가이드 (2020 개정판) 2023. 6. 29. 13:47728x90
<< 시작 전, 참고하세요 ! ✏️ >>
[SQL 전문가 가이드] 1과목 - 제 4장. 관계(Relationship) 정리 ( + RDBMS, Relation과 Relation의 차이)
1. 관계(Relation)의 개념 가. 관계의 정의 관계(關係, Relationship) : 둘 이상의 사람, 사물, 현상이 서로 관련을 맺거나 관련이 있음. 즉, 상호 연관성이 있는 상태를 뜻한다. 이러한 관계를 데이터 모
01-study-for-me.tistory.com
- 식별자의 식별관계, 비식별관계와 관련 있는 '조인(Join)'
[SQL 전문가 가이드] 1과목 - 제 5장. 식별자(Identifiers) 정리
1. 식별자(identifiers) 개념 엔터티(Entity)는 인스턴스(instance)의 집합이다. 여러 개의 집합체를 담고 있는 집합은 각각을 구분할 수 있는 논리적인 이름이 필요하다. 이러한 구분자를 식별자(Idetifier)
01-study-for-me.tistory.com
1. 조인(Join)
고객과 주문 엔터티의 관계 위 이미지를 통해, 해당 모델에서는 고객과 주문이라는 엔터티가 존재하며 이 엔터티들이 관계(Relationship)를 맺고 있음을 확인할 수 있다.
고객과 주문 엔터티의 관계(2) 또한 위 이미지를 통해 해당 모델을 읽을 수 있다.
고객 엔터티의 입장에서
- '한 명의 고객은 여러 번 주문할 수 있다.'
주문 엔터티 입장에서
- '각각의 주문은 반드시 한 명의 고객에 의해 발생된다.' 정도로 이해할 수 있다.
관계를 맺음으로 생기는 현상은 고객 엔터티의 식별자인 고객번호를 주문에 상속시킨 것이다.
즉, 관계를 맺는다는 것은 식별자를 상속시키고 해당 식별자를 매핑키로 활용해 데이터를 결합하는 것이다.
조인(Join)으로 데이터를 찾는 Logic
고객과 주문 데이터 위처럼, 고객과 주문 엔터티에 저장된 데이터가 있다고 하자.
이때, "주문번호가 C02인 주문의 고객명은 무엇인가?" 해당 데이터를 찾는 과정을 살펴보자.
- 주문 데이터에 주문번호가 C02인 데이터를 찾는다.
- 주문번호가 C02인 데이터의 행에서 고객번호를 확인한다. (고객번호 : 103)
- 확인한 고객번호 103을, 고객 데이터에서 찾는다.
- 고객번호가 103인 데이터의 행에서 고객명을 찾는다. (고객명 : 이소정)
해당 과정을 통해, 주문번호가 C02인 주문의 고객명은 '이소정' 고객임을 알 수 있다.
이것이 바로 관계를 활용한 조인이다.
관계에 의해 상속된 고객번호(FK)라는 속성을 가지고 주문 데이터에서 매핑키로써 고객명을 찾아냈다.
2, 3번이 조인이고 고객번호가 바로 조인키(Join Key)가 되는 것 이다.
이를 SQL로 작성한다면 아래처럼 작성할 수 있다.
SELECT B.고객명 FROM 주문 A, 고객 B WHERE A.주문번호 = 'C02' AND A.고객번호 = B.고객번호
2. 계층형 모델 (Hierarchical Model)
계층형 데이터 간혹 자기 가신에게 관계를 발생하는 경우도 있다. 이러한 케이스의 모델을 계층형 모델이라 한다.
( 또는 계층형 데이터 모델이라 한다. (Hierarchical Data Model) )
테이블에 계층형 데이터가 존재하는 경우, 데이터를 조회하기 위해서 계층형 질의(Hierarchical Query)를 사용한다.
계층형 데이터란 동일 테이블에 계층적으로 상위와 하위 데이터가 포함된 데이터를 말한다.
예를 들어, 사원 테이블에서는 사원들 사이에 상위 사원(관리자)과 하위 사원 관계가 존재하고 조직 테이블에서는 조직들 사이에 상위 조직과 하위 조직 관계가 존재한다. 엔터티를 순환관계 데이터 모델로 설계할 경우 계층형 데이터가 발생한다. 순환관계 데이터 모델의 예로는 조직, 사원, 메뉴 등이 있다.
계층형 모델에서의 Join
사원 데이터 위 그림은 사원 엔터티에 존재하는 데이터 중 일부를 보여주고 있다.
이때, "사원이름이 SMITH인 사원의 담당자의 이름은?" 해당 데이터를 찾는 과정을 살펴보자.
SQL로 표현해보자.
SELECT B.ENAME FROM EMP A, EMP B WHERE A.ENAME = 'SMITH' AND A.MGR = B>EMPNO
위 SQL 쿼리문에서 확인할 수 있는 점은 '자기 자신'을 조인하였다는 것이다. 이를 셀프 조인(Self-Join)이라 한다.
이가 가능한 이유는, 해당 엔터티 모델이 자기 자신에게 관계를 맺었기 떄문이다.
관계를 맺었다는 것은 식별자를 상속한다는 것이고, 위 모델에서는 상속된 식별자가 바로 MGR 속성인 것이다.
계층형 데이터 즉, 계층형 데이터 모델은 데이터 간의 계층이 존재할 때 발생하는 모델이라 할 수 있다.
위 그림은 계층 구조를 표현한 이미지이다.
이러한 데이터는 생소하지만 실제 업무에 꽤나 녹아 있기에 이와 같은 모델이 존재한다.
대표적인 예시로는 쇼핑몰 카테고리가 있다.
3. 상호배타적 관계 (Mutually Exclusive Arc Relationship)
상호 배타적
: 두 대상이 어떤 속성에서 서로 다른 것,
두 대상이 상대를 밀치고 거부하는 것.
이때, 한 기준에서는 공통적인 부분이 존재할 수 있다.상호 배타적(Exclusive-OR) 관계는 업무에 따라 얼마든지 나타날 수 있으므로, 개념을 숙지하도록 하자.
배타적 관계 위 그림은 상호배타적 관계를 표현하고 있다.
고객으로부터 개통이나 장애처리 요청을 받으면 작업기사에게 작업지시서를 발행한다.
한 작업자에게만 작업지시를 내릴 때가 많지만, 작업 내용에 따라서는 여러 작업자가 필요할 수도 있다.
또한, 여러 작업자가 동시에 출동하는가 하면, 시간 간격을 두고 따로 출동하기도 한다.
해당 그림에는 모두 표현되지 않았지만, 개통신청과 장애접수는 관리하는 속성이 상당히 달라 별도의 테이블로 설계했다.
반면, 작업지시는 개통신청이든 장애접수든 거의 같은 속성을 관리하므로 한 테이블로 설계했다.
한 테이블로 통합하더라도 개통신청이나 장애접수 중 어느 것과 관계를 갖는지 구분할 수 있어야 한다.
이와 같은 데이터 모델을 실제 데이터베이스로 구현할 때, 작업지시 테이블에는 아래 두 가지 방법 중 하나를 사용한다.
① 개통신청번호, 장애접수번호 두 칼럼을 따로 두고, 레코드별로 둘 중 하나의 칼럼에만 값을 입력한다.
② 작업구분과 접수번호 칼럼을 두고, 작업구분이 ‘1’일 때는 개통신청번호를 입력하고 ‘2’일 때는 장애접수번호를 입력한다.
①번처럼 설계할 때는 아래와 같이 Outer 조인으로 간단하게 쿼리를 작성할 수 있다.
[ 참고 : 계층형 질의와 셀프 조인 - DATA ON AIR ]
[ 참고 : 고급 조인 기법 - DATA ON AIR ]
728x90'데이터베이스(DataBase) > SQL 전문가 가이드 (2020 개정판)' 카테고리의 다른 글