관계 해석과 관계 대수 (Relational Calculus and Relational Algebra)
데이터 모델은 현실 세계의 데이터를 구조화하여 표현하기 위한 도구로, 데이터베이스의 구조, 제약조건, 그리고 데이터를 처리하는 연산을 정의한다. 이 중 개념적 데이터 모델의 대표적인 예는 개체-관계(ER, entity-relationship) 모델로, 데이터베이스의 개념적 구조를 시각적으로 표현하는 데 사용된다. 반면, 논리적 데이터 모델의 대표적인 예는 관계형 데이터 모델(참고링크)이며, 이는 데이터를 표(table)의 형태로 표현하고 논리적인 구조를 정의한다.
관계형 데이터 모델은 데이터 구조, 제약조건, 연산의 세 가지 구성 요소로 이루어진다. 데이터 구조는 데이터를 테이블 형식으로 나타내며, 각 테이블은 행과 열로 구성된다. 제약조건은 데이터의 무결성과 일관성을 유지하기 위한 규칙들로, 대표적으로 키 제약조건, 도메인 제약조건, 참조 무결성 등이 있다. 연산은 데이터를 질의하고 조작하기 위한 수단으로, 이를 관계 연산(relational operation)이라고 하며, 관계 대수와 관계 해석이라는 두 가지 방식으로 나뉜다.
관계 대수(relational algebra)는 원하는 결과를 얻기 위해 어떤 연산을 어떤 순서로 수행할지를 명시하는 절차적(procedural) 언어이다. 즉, 데이터를 처리하는 구체적인 절차를 단계적으로 기술한다. 또한 피연산자도 관계이고, 그 연산의 결과도 관계이기에 폐쇄 특성(closure porperty)가 존재한다. 즉 닫힌 연산이다.
반면, 관계 해석(relational calculus)은 원하는 결과가 어떤 조건을 만족해야 하는지를 선언적으로 기술하는 비절차적(non-procedural) 언어이다. 즉, 사용자는 어떤 데이터를 원하는지만 기술하면, 시스템이 그 조건을 만족하는 데이터를 추출해준다.
요약하자면, 관계 대수는 무엇을 어떻게 처리할 것인가를 단계적으로 명시하는 방식이고, 관계 해석은 무엇이 필요한가를 조건 중심으로 기술하는 방식이다.
관계 대수 연산자 (Relational Algebra operator)
관계 대수 연산자는 일반 집합 연산자(set operator)와 순수 관계 연산자(relational operator)로 나뉜다. 일반 집합 연산자는 합집합(union), 교집합(intersection), 차집합(difference), 카티션 프로덕트(cartesian product)가 있고, 순수 관계 연산자는 선택(selection), 투영(projection), 조인(join), 분할(division)이 있다.
일반 집합 연산자는 릴레이션이 튜플의 집합이라는 개념을 이용한 것으로 관계를 나타내는 표 두 개를 피연산자로 새로운 관계를 나타내는 표를 만드는 연산자이다. 순수 관계 연산자는 릴레이션의 구조와 특성을 이용하는 연산자이다.
• 일반 집합 연산자
- 합집합 (union)
합병 가능한 두 릴레이션 $ A $ 와 $ B $ 에 대해 연산을 진행하면 $ A \cup B $ 이다. 릴레이션 $ A $ 혹은 $ B$ 에 속하는 모든 튜플로 결과 릴레이션이 구성되며, 차수는 $ A $ 와 $ B $ 의 차수와 같고, 카디널리티는 $ A $ 와 $B $ 의 카디널리티를 더한 것과 같거나 작다. 교환 가능, 즉 $ A \cup B = B \cup A $ 이며, 결합적 특징이 있다. 즉 $ (A \cup B) \cup C = A \cup (B \cup C) $ 이다.
- 교집합 (intersection)
합병 가능한 두 릴레이션 $ A $ 와 $ B $ 에 대한 연산을 진행하면 $ A \cap B $ 이다. 릴레이션 $ A $ 와 $ B $ 에 공통으로 속하는 튜플로 결과 릴레이션이 구성되며, 차수는 $ A $ 와 $ B $ 의 차수와 같고, 카디널리티는 $ A $ 와 $ B $ 의 어떤 카디널리티보다 크지 않다. 교환 가능, 즉 $ A \cap B = B \cap A $ 이며, 결합적 특징이 있다. 즉 $ (A \cap B) \cap C = A \cap ( B \cap C) $ 이다.
- 차집합 (difference)
합병 가능한 두 릴레이션 $ A $ 와 $ B $ 에 대한 연산을 진행하면 $ A - B$ 이다. 릴레이션 $ A $ 에는 존재하지만, $ B $ 에는 존재하지 않는 튜플로 결과 릴레이션이 구성되며, 차수는 $ A $ 와 $ B $ 의 차수와 같고, 카디널리티는 $ A $ 의 카디널리티와 같거나 작다. 교환, 결합적 특징이 없다.
- 카티션곱 (cartesian product)
릴레이션 $ A $ 와 $ B $ 에 대한 연산을 진행하면 $ A \times B $ 이다. 릴레이션 $ A $ 에 속한 각 튜플과 릴레이션 $ B $ 에 속한 각 튜플을 모두 연결하여 만들어진 새로운 튜플로 결과 릴레이션이 구성되며, 차수는 $ A $ 와 $ B $ 의 차수를 더한 것과 같고, 카디널리티는 $ A $ 와 $ B $ 의 카디널리티를 곱한 것과 같다. 교환 가능, 즉 $ A \times B = B \times A $ 이며, 결합적 특징이 있다. 즉 $ (A \times B) \times C = A \times (B \times C) $ 이다.
• 순수 관계 연산자
- 선택 (selection)
하나의 릴레이션을 대상으로 연산을 수행하는데, 릴레이션에서 조건을 만족하는 튜플만 선택하여 결과 릴레이션을 구성한다. 수학적으로는 $ \sigma_{\text{<condition>}} (\text{relation}) $ 으로 표기한다. 데이터 언어적으로는 relation WHERE condition
으로 표현한다.
여기서 조건식은 비교식 혹은 프레디킷(predicate)이라고도 하며, 속성과 상수의 비교나 속성들 간의 비교로 표현된다. 비교 연산자인 $ < $, $ > $, $ \leq $, $ \geq $, $ \neq $, $ = $ 등과 논리 연산자 $ \land $, $ \lor $, $ \lnot $ 등을 이용해 작성한다.
교환적 특징이 있다. 즉 $ \sigma_{\text{<condition1>}} (\sigma_{\text{<condition2>}} (\text{relation})) = \sigma_{\text{<condition2>}} (\sigma_{\text{<condition1>}} (\text{relation})) = \sigma_{\text{<condition1>} \land \text{<condition2>}} (\text{relation}) $ 이 성립한다.
- 투영 (projection)
하나의 릴레이션을 대상으로 연산을 수행하는데, 릴레이션에서 선택한 속성의 값으로 결과 릴레이션을 구성한다. 수학적으로는 $ \pi_{\text{<attribute>}}(\text{relation}) $ 으로 표기한다. 데이터 언어적으로는 relation[attribute]
로 표현한다. 수학적 표기를 포함하여 attribute
는 리스트로 여러 개의 값이 들어올 수 있다.
- 조인 (join)
두 릴레이션 $ A $ 와 $ B $ 의 조인 속성을 사용하는데, 조인 속성의 값이 같은 튜플만 연결하여 튜플을 생성하고, 이렇게 생성된 튜플을 결과 릴레이션에 포함한다. 조인 속성은 두 릴레이션이 공통으로 가지고 있는 속성, 즉 열이다. 수학적으로는 $ A \bowtie B $ 로 표기한다.
조인 연산은 그 안에서도 다양하게 나뉘는데, $ \bowtie_\theta $ 로 표기되는 세타조인(theta join), $ \bowtie_N $ 로 표기되는 자연조인(natural join), $ \bowtie $ 로 표기되는 동등조인(equi-join), $ \ltimes $, $ \rtimes $ 로 표기되는 세미조인(semi join), $ ⟕ $, $ ⟖ $, $ ⟗ $ 로 표기되는 외부조인(outer join) 이 있다.
세타조인부터 알아보면 주어진 조건을 만족하는 두 릴레이션의 모든 튜플을 연결하여 튜플을 생성하고, 이를 이용하여 결과 릴레이션을 구성한다. 결과 릴레이션 차수는 피연산된 두 릴레이션의 차수를 더한 것과 같다. 예를 들어 $ A $ 의 속성 $ a $ 와 $ B $ 의 속성 $ b $ 에 대해 $ a $ 가 $ b $ 보다 크면 튜플을 연결하고 싶다면, $ A \bowtie_{(a > b)} B $ 로 표기한다. 속성 사이에는 비교 연산자가 들어갈 수 있다.
동등조인은 세타조인의 특수한 형태로 비교 연산자가 $ = $ 인 경우를 말한다. 즉 $ A \bowtie_{(a = b)} B $ 와 같은 형태면 동등조인이다. 즉 조인 속성의 값이 동일한 튜플을 연결하여 튜플을 생상하고, 이를 활용해 결과 릴레이션을 구성한다. 단 조인 속성으로 사용한 열이 중복하여 결과 릴레이션에 포함된다.
동등조인을 사용할 때 결과 릴레이션에 조인 속성이 중복하여 들어가는 것을 방지한 것이 자연조인이다. 동등조인과 동일하게 작동하지만, 조인에 참여한 속성이 두 번 나오지 않도록 두 번째 속성을 제거한다. $ A \bowtie_{N(a, b)} B $ 와 같이 표기하면 앞서 $ A \bowtie_{(a = b)} B $ 에서 $ b $ 를 제거한 것이라 생각하면 된다.
세미조인은 조인 속성으로 투영(projection) 연산을 수행한 릴레이션을 이용하는 조인이다. 즉 $ A \ltimes_{(a, b)} B $ 라 하면 $ B $ 를 조인 속성 $ b $ 로 투영 연산한 후 $ A $ 에 자연조인하여 결과 릴레이션을 구성한다. 불필요한 속성을 미리 제거하여 조인 연산 비용을 줄이는 장점이 있다. 단 교환적 특징이 없으므로, 즉 $ A \ltimes B $ 와 $ A \rtimes B $ 는 다르므로 주의해야 한다.
외부조인은 세 가지로 나눠진다. 왼쪽 외부조인(left outer join)은 $ A ⟕_{(a \theta b)} B $ 로 쓰며, 왼쪽 테이블인 $ A $ 의 모든 데이터를 유지하고, 오른쪽 테이블인 $ B $ 에서 조건에 일치하는 값을 연결한다. 오른쪽 외부조인(right outer join)은 $ A ⟖_{(a \theta b)} B $ 로 쓰며, $ B ⟕_{(b \theta a)} A $ 와 같다고 보면 된다. 양쪽 테이블 모두를 유지하는 외부조인을 완전 외부조인(full outer join)이라 하는데, $ A ⟗_{(a \theta b)} B $ 로 쓴다. 외부조인에서 찾을 수 없는 값, 즉 연결 안 되는 값은 모두 널(null)로 처리한다.
- 분할 (division)
두 릴레이션을 대상으로 수행하는 연산으로 $ A \div B $ 로 표기하며, $ B $ 의 모든 튜플과 관련이 있는 $ A $ 의 튜플만을 결과로 추출한다. 다시 말해, $ B $ 에 존재하는 모든 값과 연관된 $ A $ 의 특정 값들만 결과 릴레이션에 포함된다.
분할 연산이 가능하려면 릴레이션 $ A $ 는 $ B $ 의 모든 속성을 포함하고 있어야 한다. 즉, $ B $ 의 속성들이 $ A $ 의 속성에 포함되어야 하며, 이러한 전제 하에 연산이 정의된다. 이를 달리 표현하면, $A $ 와 $ B $는 공통된 속성(보통 $ B $ 는 하나의 속성만 가짐)을 공유하고 있어야 하며, 해당 속성의 도메인도 일치해야 한다.
예를 들어 $ B $ 를 하나의 속성 $ b $ 를 가진 릴레이션이라 할 때 $ A \div B $ 라 하면 $ A $ 에서 $ b $ 를 $ B $ 의 모든 속성값을 가진 튜플만을 모아 결과 릴레이션을 구성한다.
관계 해석 (Relational Caculus)
관계 해석은 처리를 원하는 데이터가 무엇인지만을 기술하는 것으로 비절차적 언어이다. 수학의 프레디킷 해석(predicate caculus)에 기반을 두고 있다. 즉 조건을 이용하여 검색한다.
튜플 관계 해석(tuple relational calculus)와 도메인 관계 해석(domian relational caculus)로 크게 두 분류로 나뉜다.
튜플 관계 해석의 예시로 $ \{ A.b, A.c \mid A.a == \text{'aa'} \} $ 을 보면 릴레이션 $ A $ 의 속성 $ a $ 가 $ \text{'aa'} $ 인 튜플의 $ b $, $ c $ 를 가져오라는 뜻이다.
즉 다음과 같다. 이때 특정 속성을 원하면 릴레이션에 $.$을 찍고 가져온다. 예를 들어 릴레이션 $ A $ 의 $ a $ 속성을 가져오고 싶다면 $ A.a $ 로 표기한다. $A $ 로 표기하면 전체 튜플을 가져온다.
$$ \{ \text{wanted tuple or attribute of wanted tuple} \mid \text{<condition>} \} $$
도메인 관계 해석 역시 비슷하다. 원하는 데이터의 조건을 기술함으로써 정보를 검색한다. 차이점은 튜플 전체를 대상으로 하는 것이 아니라, 각 속성 값(도메인 값)을 개별 변수로 사용한다는 점이다. 즉, 릴레이션의 각 컬럼에 해당하는 값들을 변수로 선언하고, 그 변수들에 대한 조건을 논리식으로 표현하여 원하는 결과를 얻는다.
예를 들어, 릴레이션 $ A $ 가 속성 $ a $, $ b$, $c$ 로 구성되어 있다고 할 때, 속성 $ a $ 가 $ \text{'a'} $ 인 튜플의 $ b $, $ c $ 값을 도메인 관계 해석으로 표현하면 $ \{ b, c \mid \exists a (A(a, b, c) \land a = \text{'aa'}) \} $ 이다. 일반화하면 다음과 같다.
$$ \{ \text{wanted attributes} \mid \text{<condition involving domain variables>} \} $$
'Computer Science and Engineering > Database' 카테고리의 다른 글
[DB] 관계 데이터 모델(relation data model) (0) | 2025.04.01 |
---|---|
[DB] 데이터 모델링(data modeling) 및 표기법(notation) (0) | 2025.03.26 |
[DB] 데이터 정의어(DDL),데이터 조작어(DML), 데이터 제어어(DCL) (0) | 2025.03.19 |
[DB] 데이터베이스 구조 및 구성 (0) | 2025.03.19 |
[DB] 데이터베이스 관리 시스템(DBMS, database management system) (0) | 2025.03.12 |