본문 바로가기

ComputerScience/Database 이론

[Database] 6. 관계 데이터 연산 개념 정리

 

안녕하세요. CS지식 정리도 할 겸, 학교에서 배운 데이터베이스 개념 + "데이터베이스 개론-IT COOKBOOK" 의 책을 공부하며 알게 된 내용을 정리하려고 합니다. 지난 포스트 "관계형 데이터 모델(Relational data model) 개념 정리"에 이어 이번에는 관계 데이터 연산에서 관계 대수에 관한 개념을 정리해보려고 합니다. 주관적으로 작성된 글이기에 틀린 내용이 있을 수 있습니다.(댓글로 알려주시면 감사합니다:)

 

데이터 모델은 데이터 구조(schema)와 constraint(제약조건) 뿐 아니라 연산을 통해 여러 relation간 데이터를 다룰 수 있습니다.

1. 관계 대수

관계 대수는 관계형 데이터베이스에서 사용되는 Query(질의) 언어 중 하나입니다. 다양한 연산자들이 있고 이들을 조합해 복잡한 query를 수행해서 원하는 결과를 도출할 때 사용됩니다. 크게 일반집합 연산자, 순수 관계 연산자로 분류할 수 있습니다.

 

이 언어를 실제로 사용하지는 않지만 이 개념을 기반으로 실제 사용자가 db를 이용하는 database system에서는 SQL 문법을 통해 db에 대한 query, 조작을 수행합니다. 관계 대수는 이론적인 개념입니다. db이론 or 데이터 모델링에서 가용되는 기반 원리 중 하나입니다.

일반 집합 연산자

  • 합집합 : R ⋃ S | 릴레이션 R, S의 합집합 반환
  • 교집합 ∩ : R ∩ S | 릴레이션 R, S 교집합 반환 
  • 차집합 - : R - S | 릴레이션 R, S의 차집합 반환
  • 카티션 프로덕트 x : R x S | 릴레이션 R, S의 튜플들을 모두 연결해서 새로운 튜플 반환

 

이렇게 릴레이션 집합이 존재한다면,

 

 

이런 연산이 가능합니다.

 

합병 가능한 조건. 주의할 점!

합집합, 교집합, 차집합의 경우 relation간 속성의 개수가 같아야 합니다. 각 attribute(속성)'s domain이 일치해야 합니다.

 

카티션 프로덕트를 보면 예를들어 R size = 2*8, S size = 2*2라고 가정할 때, R의 속성 2개와 S의 속성 2개를 전부 모은 후에 R의 각 튜플에 대해 S의 모든 튜플을 포함하는 데이터를 만듭니다. 그 결과 4*16 크기의 Relation이 반환됩니다. 카티션 프로덕트는 위에서 언급한 합병 가능한 조건을 만족하지 않아도 됩니다. 카티션 프로덕트의 결과 속성을 표현할 때 R.속성1, R.속성2, S.속성1, S.속성2 .... 로 표현하면 되기 때문입니다.

순수 관계 연산자

릴레이션의 구조와 특성 기반으로 관계 데이터 모델에서 새로 제시된 연산자입니다.

  • 셀렉트 σ : σ조건(R) | 릴레이션 R에서 조건을 만족하는 튜플들 반환. 교환 법칙 성립
  • 프로젝트 ∏ : ∏속성리스트(R) | 릴레이션 R에서 주어진 속성들의 값으로만 구성된 튜플들 반환
  • 조인 ⋈ : R ⋈ S | 공통 속성을 기반으로 릴레이션 R과 S의 튜플들을 연결한 새로운 튜플들 반환
  • 디비전 ÷ : R ÷  S | 릴레이션 S의 모든 튜플과 관련 있는 릴레이션 R의 튜플들 반환

 

예제를 보며 이해하는게 빠릅니다. 참고로 조건에서 문자는 ' ' single qouting 으로 표시해야 합니다.

고객 Relation
id(PK) name age rating
apple 20 gold
banana 23 gold
orange 30 silver
carrot 25 vip

 

위와 같은 고객 릴레이션이 있을 때

Select σ

명령어: σ조건(R)

1. 고객 릴레이션에서 등급이 gold인 튜플을 검색하시오.

ans: σ등급='gold'(고객)

 

결과 릴레이션 Relation
id name age rating
apple 20 gold
banana 23 gold

2. 고객 릴레이션에서 등급이 gold이고, 나이가 25 이상인 튜플을 검색하시오.

ans: σ등급='gold' ∩ 나이 >= 23(고객)

 

여기서 Select의 경우 교환 법칙이 성립하기 때문에

 

  • σ등급='gold' ∩ 나이 >= 23(고객)
  • σ나이 >= 23( σ등급='gold' (고객 ) )
  • σ등급='gold'( σ나이 >= 23 (고객 ) )

이 세가지 경우가 다 같은 결과 릴레이션을 반환합니다.

 

결과 Relation
id(PK) name age rating
banana 23 gold

 

프로젝트

 명령어: ∏속성리스트(R)

1. 고객 릴레이션에서 고객이름, 등급을 검색하시오.

ans: ∏고객이름, 등급(고객)

 

결과 Relation
name rating
gold
gold
silver
vip

 

2. 고객 릴레이션에서 등급을 검색하시오.

ans: ∏등급(고객)

 

결과 Relation
rating
gold
silver
vip

 

여기서 중요한 점은 두 릴레이션 간 순수 관계 연산의 결과 또한 릴레이션입니다. 릴레이션은 중복되는 튜플이 있어서 안됩니다.

 

"왜죠??"

 

각 튜플은 유일한 식별자(primary key)를 가지고 있어야 하며, 중복된 튜플은 제거되어야 합니다.

조인

명령어: R ⋈ S

고객 Relation
id(PK) name age rating
apple 20 gold
banana 23 gold
orange 30 silver
carrot 25 vip

 

기존의 릴레이션에 아래의 릴레이션이 추가되었습니다!

 

주문 Relation
orderNumber(PK) buyer (FK) product count
001 apple 꿀맛탱우동 3
002 carrot 맛있는파이 7
003 banana 그대로만두 13

 

조인 연산은 주문 relation의 fk와 고객 relation의 pk domain이 같은 경우 조인 조건이 됩니다. 그리고 두개의 fk == pk가 되어 새로운 튜플이 생성됩니다.

 

세타조인

명령어: R ⋈ AθB S

 

여기서 세타에 비교연산자가 들어옵니다. A, B는 조인 속성

 

ans: 고객 ⋈ 고객.id = 주문.buyer 주문    |   고객 ⋈ 주문

 

이렇게 할 경우 A == 고객.id, B == 주문.buyer, 세타 == =가 됩니다. 이는 동등 조인에 해당됩니다.

 

동등조인 결과 릴레이션
고객.id 고객.name 고객.age 고객.rating 주문번호 주문.고객id 주문제품 수량
apple 20 gold 001 apple 꿀맛탱우동 3
banana 23 gold 003 banana 그대로만두 13
carrot 25 vip 002 carrot 맛있는파이 7

 

자연 조인

명령어: R ⋈N S

 

자연 조인의 경우 조인 결과 릴레이션에서 중복 속성은 제거합니다.

자연 조인 결과 릴레이션
고객.id 고객.name 고객.age 고객.rating 주문번호 주문제품 수량
apple 20 gold 001 꿀맛탱우동 3
banana 23 gold 003 그대로만두 13
carrot 25 vip 002 맛있는파이 7

 

그외에도 세미조인, 외부 조인이 존재합니다.

 

2. 관계 대수 이용한 질의 표현

고객 Relation
id(PK) name age rating
apple 20 gold
banana 23 gold
orange 30 silver
carrot 25 vip
주문 Relation
orderNumber(PK) buyer (FK) product count
001 apple 꿀맛탱우동 3
002 carrot 맛있는파이 7
003 banana 그대로만두 13

 

문제에 적용해보겠습니다.

 

1. 고객이름이 양 고객의 등급과 양 고객이 주문한 주문 제품, 수량을 검색하시오.

∏rating, product, count(σ name = '양'(고객 ⋈ 주문))

 

rating product count
gold 그대로만두 13

 

 

이 문제를 접근할 때 우선 고객 릴레이션에는 주문제품, 수량 속성값 데이터가 존재하지 않습니다. 반대로 주문 릴레이션은 고객의 이름이 존재하지 않습니다. 그러나 주문 릴레이션은 고객의 pk를 fk로 갖고 있기 때문에 join이 가능합니다. join을 하게 되면 두 릴레이션이 합쳐지면서 새로운 결과 릴레이션을 반환하게 됩니다. 그래서 우선적으로 양 고객의 등급, 주문제품, 수량을 모두 검색하기 위해서 (고객 ⋈ 주문 )을 통해 결과 릴레이션을 만들어야 합니다.

 

동등조인 결과 릴레이션
고객.id 고객.name 고객.age 고객.rating 주문번호 주문.고객id 주문제품 수량
apple 20 gold 001 apple 꿀맛탱우동 3
banana 23 gold 003 banana 그대로만두 13
carrot 25 vip 002 carrot 맛있는파이 7

 

이 상태에서 특정 고객의 등급, 주문제품, 수량을 검색하기 이전에 어느 고객인지가 문제에 나왔습니다. 어느 고객인지 검색하기 위해서는 σ Select를 통해 σ조건(R)을 활용해야 합니다. 결과로는 조건에 부합하는 튜플들의 릴레이션이 반환됩니다.

 

σ name = '양' ( 동등조인 결과 릴레이션 )

 

셀렉트 결과 릴레이션
고객.id 고객.name 고객.age 고객.rating 주문번호 주문.고객id 주문제품 수량
banana 23 gold 003 banana 그대로만두 13

 

마지막으로 문제에선 등급, 주문제품, 수량을 확인하고 싶다고 했습니다 .이 경우 프로덕트 ∏속성리스트(R) 를 활용하면 됩니다.

 

∏rating, product, count(셀렉트 결과 릴레이션)

 

짜잔 +_+

 

rating product count
gold 그대로만두 13

 

 

틀린 부분 발견 시 댓글로 남겨주시면 정말 감사합니다.