[Database] 6. 관계 데이터 연산
이번 포스트에서는 관계 데이터 연산에 대해 정리하겠습니다.
관계 데이터 연산의 개념
[ 관계 데이터 모델 ]
- 관계 데이터 모델 = 연산 + 데이터 구조 + 제약조건 으로 이루어진다.
[ 관계 데이터 연산 ]
- 연산은 원하는 데이터를 얻기 위해 릴레이션에 필요한 처리 요구를 수행하는 것. 데이터베이스 시스템의 구성 요소 중 데이터 언어의 역할을 한다.
- 대표적인 관계 데이터 연산은 관계 대수와 관계 해석이 있다.
- 관계 대수는 원하는 데이터를 얻기 위해 데이터의 처리 과정을 순서대로 기술하는 절차 언어(procedural language)
- 관계 해석은 원하는 결과를 얻기 위해 처리를 원하는 데이터가 무엇인지만 기술하는 비절차 언어(nonprocedural language)
- 관계 대수와 관계 해석은 능력이 동일함. -> 즉, 관계 대수로 기술된 데이터 처리 요구 <-> 관계 해석으로 기술된 데이터 처리 요구 서로 바꿔 기술 가능함.
- 데이터에 대한 처리 요구를 질의(query)라 한다.
- 이번 포스트에서는 관계 대수에 대해서만 중점적으로 살펴보고 관계 해석은 개념만 정리.
관계 대수
- 관계 대수는 원하는 결과를 얻기 위해 데이터의 처리 과정을 순서대로 기술한 언어. 즉, 릴레이션을 처리하는 연산자들의 모임.
- 피연산자인 릴레이션에 연산자를 적용한 결과도 릴레이션이라는 폐쇄 특성(closure property).
[ 관계 대수 연산자 ]
관계 대수에 속하는 대표적인 연산자 8개는 특성에 따라 일반 집합 연산자(set operation)와 순수 관계 연산자(relational operation)로 분류할 수 있다.
일반 집합 연산자 -> 릴레이션이 튜플의 집합이라는 개념을 이용하는 연산자로, 이는 수학의 집합 관련 연산자를 차용한 것이다. 일반 집합 연산자에 속하는 연산자의 종류와 기능은 아래와 같이 합집합, 교집합, 차집합, 카티션 프로덕트가 존재한다. 이 중에서 합집합, 교집합, 차집합은 피연산자인 두 릴레이션이 합병 가능해야 연산을 수행할 수 있다.
순수 관계 연산자 -> 릴레이션의 구조와 특성을 이용하는 연산자다. 순수 관계 연산자에 속하는 연산자의 종류와 기능은 아래와 같이 셀렉트, 프로젝트, 조인, 디비전이 있다.
[ 일반 집합 연산자 ]
- 일반 집합 연산자는 릴레이션이 튜플의 집합이라는 개념을 이용하는 연산자로, 두 릴레이션을 대상으로 연산을 수행한다.
[ 일반 집합 연산자의 제약조건 ]
- 1. 일반 집합 연산자는 연산을 위해 피연산자가 2개 필요하다. 즉, 일반 집합 연산자는 2개의 릴레이션을 연산한다.
- 2. 합집합, 교집합, 차집합은 피연산자인 2개의 릴레이션이 합병 가능(union-compatiable)해야 한다.
그럼 합병 가능하다는 것은 무슨 의미일까? 아래 조건을 만족해야 2개의 릴레이션은 합병 가능하다.
- 1. 두 릴레이션의 차수가 같아야 한다. (== 두 릴레이션은 속성 개수가 같아야 한다.)
- 2. 2개의 릴레이션에서 서로 대응되는 속성의 도메인이 같다. (단, 도메인이 같으면 속성의 이름은 달라도 된다.)
예를 들면, 위 그림은 합병이 불가능하다.
- 1. 고객 릴레이션과 직원 릴레이션은 속성이 모두 3개로 차수는 같다. (O)
- 2. 고객 릴레이션의 나이 속성은 도메인이 INT이지만, 이에 대응되는 직원 릴레이션의 직위 속성은 도메인이 CHAR(20)으로 다르다. (X)
-> 즉, 두 릴레이션은 합병이 불가능하며, 합집합, 교집합, 차집합 연산을 수행할 수 없다.
반면 아래 그림은 조건을 모두 만족하므로 합병이 가능하다.
[ 합집합 ]
- 합집합(Union)의 기호는 ∪로 표시한다.
- 각각의 릴레이션에 속하는 모든 튜플로 결과 릴레이션을 구성한다.
- 단, 연산의 결과 릴레이션에서 중복되는 튜플은 한번만 나타난다.
- 그러므로, 카디널리티(튜플의 전체 개수)는 각 튜플의 개수를 더한 것과 같거나 작아진다.
- 교환 법칙과 결합법칙이 성립한다. (O)
즉, 위 그림에서 (100, 정소화) 튜플은 각 릴레이션에 모두 존재하지만 연산의 결과 릴레이션에서는 중복되지 않고 튜플은 한번만 나타난다.
[ 교집합 ]
- 교집합(intersection)의 기호는 ∩로 표시한다.
- 각각의 릴레이션에 공통으로 속하는 튜플로 결과 릴레이션을 구성한다.
- 연산 결과 릴레이션의 카디널리티는 각각의 릴레이션의 어떤 카디널리티 보다도 크지 않다. 즉, 같거나 작다.
- 교환 법칙과 결합법칙이 성립한다. (O)
합병이 가능한 두 릴레이션 R과 S의 교집합(intersection)은 R∩S로 표현한다. R∩S는 릴레이션 R과 S에 공통으로 속하는 튜플로 결과 릴레이션을 구성한다. [아래 그림 6-9]는 합병이 가능한 릴레이션 R과 S를 교집합 연산한 예시다.
즉, 위의 그림에서 (100, 정소화)만 동일하므로 R∩S의 카디널리티는 1이다.
[ 차집합 ]
- 차집합(difference)의 기호는 -로 표시한다.
- R-S라면, R에는 존재하지만 릴레이션 S에는 존재하지 않는 튜플로 결과 릴레이션을 구성한다.
- 연산 결과 릴레이션의 카디널리티는 왼쪽 카디널리티보다 같거나 적다. 즉, R-S는 릴레이션 R의 카디널리티보다 적고, S-R은 릴레이션 S의 카디널리티와 같거나 적다.
- 교환 법칙과 결합법칙이 성립하지 않는다. (X)
즉, 위의 결과에서 R-S는 공통 튜플인 (100, 정소화)를 뺀 (200, 김선우), (300, 고명석)이 된다.
[ 카티션 프로덕트 ]
- 카티션 프로덕트(cartesian product)의 기호는 ×로 표시한다.
- 각 릴레이션에 속한 튜플을 모두 연결하여 만들어진 새로운 튜플로 결과 릴레이션을 구성한다.
- 두 릴레이션이 합병이 불가능한 경우에도 카티션 프로덕트 연산은 가능하다. (아래에서도 이름과 나이의 도메인이 다름에도 가능하다.)
- 연산 결과 릴레이션에서 속성은 '릴레이션이름.속성이름' 형식으로 표기된다. (원래 어느 릴레이션 소속이었는지를 나타내기 위해.)
- 만약, 릴레이션 속성 이름이 다르다면 소속 릴레이션 이름을 생략하고 표기해도 된다.
- 연산 결과 릴레이션의 차수는 각 피연산자 릴레이션 차수를 더한 것과 같다.
- 연산 결과 릴레이션의 카디널리티는 각 피연산자 릴레이션의 카디널리티를 곱한 것과 같다.
- 교환 법칙과 결합법칙이 성립한다. (O)
위 그림에서 카티션 프로덕트 연산을 한 결과 릴레이션의 차수는 피연산자인 릴레이션 R과 S의 차수를 더한 것과 같다. (R의 차수 2 + S의 차수 2 = 4) 그리고 카디널리티는 릴레이션 R과 S의 카디널리티를 곱한 것과 같다. (R의 카디널리티 3 X S의 카디널리티 3 = 9)
[ 순수 관계 연산자 ]
- 순수 관계 연산자는 릴레이션의 구조와 특성을 이용하는 연산자다. 셀렉트, 프로젝트, 조인, 디비전이 있다.
[ 셀렉트 ]
- 셀렉트 연산의 기호는 σ를 사용한다.
- 주어진 조건을 만족하는 튜플만 선택하여 결과 릴레이션을 구성한다.
- 즉, 결과 릴레이션은 수평으로 절단한 모양이 된다.
- where 문과 조건식을 이용해 데이터 언어 형식으로도 표현할 수 있다.
- 수평적 부분집합(horizontal subset)을 생성한 것과 같다.
- 교환 법칙이 성립한다. (O)
[ 프로젝트 ]
- 프로젝트(project) 연산의 기호는 π를 사용한다.
- 선택한 속성에 해당하는 값으로 결과 릴레이션을 구성한다.
- 즉, 결과 릴레이션은 일부 열로만 구성된다.
- 릴레이션[속성리스트]와 같은 형태로 데이터 언어 형식으로도 표현할 수 있다.
- 수직적 부분집합(vertical subset)을 생성한 것과 같다
[ 조인 ]
- 조인(join) 연산의 기호는 ⋈를 사용한다.
- 두 릴레이션을 조합하여 하나의 결과 릴레이션을 구성한다.
- 즉, 결과 릴레이션은 피연산자 릴레이션에서 조인 속성의 값이 같은 튜플만 연결하여 만든 새로운 튜플을 포함한다.
- 카티션 프로덕트 연산을 수행한 후 조인 속성의 값이 같은 조건을 만족하는 튜플을 반환하는 셀렉트 연산을 수행한 것과 같다.
- 조인 속성의 이름이 같으면 어느 릴레이션의 소속인지 구분하기 위해 '릴레이션이름.속성이름' 형식으로 표기한다.
- ex) (고객) ⋈고객.주문아이디 = 주문.주문아이디 (주문)
[ 세타 조인 ]
- 세타 조인(theta-join)은 비교 연산자를 사용해서(=, <, ≤, >, ≥, ≠) 조인 조건을 만족하는 두 릴레이션의 모든 튜플을 연결한 새로운 튜플로 결과 릴레이션을 구성한다.
- 조인 조건에 아무것도 없을 경우 동등 조인(equal-join)으로 세타 조인에서 비교연산자 '='를 사용한 것과 같다.
- ex) (고객) ⋈고객.주문아이디 = 주문.주문아이디 (주문)
[ 자연 조인 ]
- 자연 조인(natural join)은 동등 조인의 결과 릴레이션에서 중복된 속성을 제거하여 조인 속성이 한번만 나타난다.
- 자연 조인은 ⋈N 기호로 표현한다.
- 즉, 세타 조인에서 '=' 연산자를 이용해 조인 조건을 표현한 것이 동등 조인이고, 동등 조인의 결과 릴레이션에서 중복된 조인 속성을 제거하는 것이 자연 조인이다.
[ 디비전 ]
- 디비전(division) 연산의 기호는 ÷를 사용한다.
- R÷S는 릴레이션 S의 모든 튜플과 관련 있는 릴레이션 R의 튜플로 결과 릴레이션을 구성한다
- 단, 릴레이션 R이 릴레이션 S의 모든 속성을 포함하고 있어야 R÷S 연산이 가능하다.
- 주의할 점은 릴레이션 S의 모든 속성과 도메인이 같은 속성을 릴레이션 R이 포함해야 한다.
[ 세미 조인 ]
- 세미 조인(semi-join) 연산의 기호는 ⋉를 사용한다.
- 릴레이션 S의 조인 속성으로만 구성한(프로젝트한) 릴레이션을 릴레이션 R에 자연 조인하는 방법이다.
- 즉, 자연 조인 연산에 참여할 수 있는 튜플만 선택하여 결과 릴레이션을 구성한다.
- 검색에 불필요한 속성을 미리 제거하여 조인 연산의 비용을 줄일 수 있다.
[ 외부 조인 ]
- 외부 조인(outer-join) 연산의 기호는 ⟕를 사용한다. 방향으로 열려있는 나비모양)
- 두 릴레이션에 자연 조인 연산을 수행할 때 조인 속성 값이 같은 튜플이 상대 릴레이션에 존재하지 않아 조인 연산에서 제외된 모든 튜플을 결과 릴레이션에 포함시킨다.
- 이때, 결과 릴레이션에 속성 값이 없는 경우는 널(Null) 값으로 처리한다.
- 왼쪽(left) 외부 조인, 오른쪽(right) 외부 조인, 완전(full) 외부 조인으로 세분화할 수 있다.
관계 해석
- 관계 해석은 원하는 결과를 얻기 위해 처리를 원하는 데이터가 무엇인지만 기술하는 언어다.
- 튜플 관계 해석과 도메인 관계 해석으로 분류한다.
References
데이터베이스 개론, 김연희(2022)