안녕하세요. 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 |
틀린 부분 발견 시 댓글로 남겨주시면 정말 감사합니다.
'ComputerScience > Database 이론' 카테고리의 다른 글
[Database] 7-2. View 개념 정리 (0) | 2023.06.22 |
---|---|
[Database] 7 -1. SQL 개념 정리 | SQL의 DDL, DML(Select, Insert, Update, Delete) 명령어 뿌수기 +_+ (0) | 2023.06.22 |
[Database] 5. 관계형 데이터 모델(Relational data model) 개념 정리 (0) | 2023.06.21 |
[Database] 4. Data modeling 개념 정리 (0) | 2023.06.21 |