[데이터베이스] 관계대수(Relational Algebra)

Algebra

Relational Algebra 를 보기 전에, Algebra 가 무엇인지부터 알아보자. Algebra는 연산자(operator)와 피연산자(Operand)를 포함하는 수학적 시스템이다. 연산자는 어떤 결과에 대한 procedure를 표현하는 역할을 하고 피연산자는 연산자가 적용되는 대상이 되는 변수나 값을 의미한다.

Relational Algebra

Relational Algebra도 Algebra이기에 동일하게 Operand 와 Operator 가 존재한다. 일반 Algebra와 다른점은, 입력과 출력으로 Relation, 즉 테이블을 취한다는 것이다.

따라서 Operand 는 relation이 되고, Operator는 총 8가지가 있는데 이제부터 알아보자.

Select Operation

select 연산은 테이블에서 주어진 predicate 에 만족하는 tuple을 뽑는 연산이다. 기호는 σ 로 표현한다.

만약 내가 “Comp. Sci” 테이블에 있는 “Intstructor” 의 목록을 알고싶다면,

σdept_name="Comp. Sci"(Instructor)

이렇게 쿼리를 작성할 수 있다. 위와 같이 단순한 predicate 뿐만 아니라 좀 더 복잡한 predicate도 만들어서 쿼리를 작성할 수 있다.

σdept_name="Comp. Sci" ⌃ salary>70,000(Instructor)

이런 쿼리를 사용하면 AND 연산을 통해 department 가 Comp. Sci 이면서 salary가 70,000 이 넘는 tuple들만 찾아서 가져오게 할 수 있다.

또 다른 예를 보면,

σdept_name=building(Department)

이런 쿼리를 통해서 dep_name attribute의 값과 building attribute의 값이 동일한 department 들만 뽑아서 가져오게 할 수도 있다.

Project Operation

Project operation은 또 다르게 unary operationd이라고도 한다. 특정 attribute들을 골라내는 연산자이다.

Piname, salary(instructor)

이런 쿼리를 통해서 instructor relation에서 name과 salary만 골라서 가져오도록 할 수 있다.

쿼리 안에 쿼리?

쿼리 안에 다른 쿼리를 끼워넣어서 한 쿼리의 결과를 새로운 쿼리의 입력으로 사용할 수 있다. 일종의 파이프 라인이라고 생각하자.

Pinamedept_name="Comp. Sci“(instructor))

이런 쿼리를 통해 먼저 selection operation을 하고 그 결과를 projection operation에서 사용하는 것이 가능하다. 그리고 기억해야할 것은 projection operation은 중복을 모두 제거한다.

Cartesian-Product Operation

카테시안 프로덕트는 조합을 만드는 연산이다. 조금은 무식하지만, 만들 수 있는 모든 조합을 만든다. 한 attribute를 다른 테이블에서 해당 값을 가지는 모든 tuple을 찾는다. 만약 15개의 수업이 나열되어 있는 테이블과 12명의 교과목 교수님들이 나열되어 있는 테이블에 수업이름을 기준으로 cartesian product를 수행하면, 그 결과로 12X15인 총 180개의 새로운 tuple이 결과로 만들어질 것이다.

Theta Join Operation

Theta Join 연산자는 카테시안 조합보다 조금 덜 무식한 방법이다. 카테시안 연산의 예에서, 12명의 교과목 교수님들이 모두 15개의 수업을 가르치지는 않을 것이다. 따라서 우리는 특정한 attribute를 사용해서 수업의 종류에 대한 데이터를 만들고 이 값을 join operation에 사용하면, 우선 cartesian-product operation으로 모든 조합이 생성된 뒤, 이후에 selection operation을 사용해서 조건이 되는 attribute들만 가져오도록 지정할 수 있다. 이 두단계를 한번에 해주는 연산이 theta join operator이고, 다음과 같이 나타낸다.

r ⨝𝜃 s

여기서 세타는 join 할 조건을 의미한다.

Union Operation

union은 우리가 아는 합집합이다. 양 테이블에 존재하는 모든 tuple들을 합치는 것이다. 그런데 이 연산을 사용하려면 몇가지 조건이 필요하다.

만약 r이라는 테이블과 s라는 테이블의 union operation을 수행하고 싶다면, 1) r과 s는 똑같은 갯수의 attribute를 가지고 있어야 한다(arity가 같다고도 한다). 그리고 2) 두 테이블의 domain이 비교가 가능해야한다. 다른 말로, 두 attribute 사이의 타입이 같아야 한다는 것이다.

Uninon Operation은 다음과 같은 기호로 나타낸다.

R ∪ S

그리고 union 하는 과정에서 중복된 tuple을 삭제한다.

Set-intersection Operation

set-intersection은 우리가 아는 교집합과 동일하다. 양 테이블에 모두 존재하는 tuple들만 가져오는 것이다.

set-intersection operation의 수행 조건은 union operation과 동일하다. 1) r과 s는 똑같은 갯수의 attribute를 가지고 있어야 한다(arity가 같다고도 한다). 그리고 2) 두 테이블의 domain이 비교가 가능해야한다. 다른 말로, 두 attribute 사이의 타입이 같아야 한다는 것이다.

Set-intersection operation은 다음과 같이 나타낸다.

R ∩ S

Set-Difference Operation

Set-Difference operation은 한 테이블에는 존재하고 다른 테이블에는 존재하지 않는 tuple들을 찾는 연산이다. 여집합이라고 생각하자. set 에 대한 연산이기에 연산 수행에 대해 동일한 조건이 그대로 유지된다. 1) r과 s는 똑같은 갯수의 attribute를 가지고 있어야 한다(arity가 같다고도 한다). 그리고 2) 두 테이블의 domain이 비교가 가능해야한다. 다른 말로, 두 attribute 사이의 타입이 같아야 한다는 것이다.

Set-difference operation은 다음과 같이 나타낸다.

R - S

Assignment Operation

쿼리를 중첩해서 작성하다보면 보기에도 어렵고 작성하는 사람도 헷갈린다. 그래서 우리는 Assignement Operation을 통해 쿼리의 일부를 변수에 담아서 사용할 수 있다.

기호는 아래와 같이 화살표로 나타내고 아래의 예를 보면 더 명확히 어떤 기능인지 알 수 있을 것이다.

Physics <- σdept_name=“Physics” (instructor)
Music <- σdept_name=“Music” (instructor)
Physics ∪ Music

Rename Operation

Rename operation은 어떤 쿼리에 대해 이름을 붙이는 연산자이다.

기호는 로우(𝝆)를 사용하고 아래 예를 통해 더 자세히 알아보자.

𝝆x(E)

위와 같은 식을 사용하면, E가 쿼리, x가 이름이라고 했을 때, 특정 쿼리에 대해서 이름을 붙일 수 있게 되는 것이다.

Equivalent Queries

Equivalent Query는 다르게 생겼지만 완전히 동일한 결과를 내는 쿼리들을 의미한다.


전여훈
Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.