Relation

Domain: Attribute types
- 도메인은 각 attribute에 대해 허용된 값들의 집합임
- Domain = data type + constrains
- 예를 들어 Score : 0-100 사이의 숫자
- Attribute 값들은 atomic해야함
- Null은 모든 도메인의 원소임
Relation Schema and Instance
- A1,A2,…,An 이 attributes
- R=(A1,A2,…,An)이 relation schema
- 예를 들어 instructor = (ID, name, dept_name, salary)
- relation은 인스턴스, 즉 tuple들의 집합임.
Relations are Unordered
- tuple들의 순서는 상관없음 (임의의 순서로 저장됨)
- 즉, relation은 집합

Database
- 데이터베이스는 여러 relation으로 이루어짐
- 예를 들어 대학 데이터베이스는 instructor, student, advisor relation으로 구성됨
Key
- 해당 relation에서 가장 중요한 역할을 수행하는 attribute

Key의 정의
-
K⊆R이라 하자
-
만약 K의 값들이 relation R의 유일한 순서쌍을 식별하는데 충분하다면, K는 R의 superkey임
- 예를 들어 {ID}와 {ID, name}은 모두 instructor의 superkey임
-
Minimal superkey를 candidate key라고 부름
예를 들어 {ID}는 Instructor의 후보키임
-
후보키 중 하나를 primary key로 선택함
Relational Query Languages
두 개의 수학적 query language가 있음
- Relational algebra
- 더 기능적이고, 실행 계획을 나타낼 때 유용함
- Relational calculus
- 더 선언적임. 즉 어떻게 계산할지보다 어떤걸 원하는지를 표현함
- 더 이론적이어서 본 수업에서는 다루지 않음
- 예를 들어 SSN이 10인 학생을 찾는 건
{t∣t∈STUDENT∧t[ssn]=123}
Relational Operators
다섯 개의 기본적인 relational 연산자가 있음
- Union (∪)
- Selection (σ)
- Projection (Π)
- Cartesian Product (×)
- Set Difference (−)
Union (∪)
합집합

Set difference (−)
차집합

Selection (σ)

- 여기에서 A=B이고, D>5인 tuple들을 찾는건 아래와 같이 표현할 수 있음
σA=B∧D>5(r)

Projection (Π)
- 프로젝션은 열들을 선택한뒤 중복을 제거함
- 관계 r에 대해

- A와 C를 선택하는 Projection ΠA,C(r)은

Cartesian Product (×)
- 카테시안 곱은 가능한 모든 쌍을 생성함
- 관계 r,s에 대해


for each row i in r
for each row j in s
output i,j
예시
- 'swe3003'을 듣는 학생들의 이름을 찾아보자

Πname(σStudent.ID=Take.ID∧c_id=′swe3003′(Student×Take))

파생연산자
- 기본 5개 관계 연산자만으로 충분하지만,
- Union (∪)
- Selection (σ)
- Projection (Π)
- Cartesian Product (×)
- Set Difference (−)
- 편의를 위해 파생연산자를 추가함
- Set Intersection (∩)
- Join (⋈)
- Rename (ρ)
- Division (÷)
- Group by (G)
Set Intersection (∩)


- 이는 A∩B 가 A−(A−B)와 동치이기 때문에 기본연산자가 아님.
Natural Join (⋈)
- R⋈S=ΠR.a,R.b,…(σR.a=S.a∧R.b=S.b∧⋯(R×S))
- 즉 R과 S의 각 순서쌍 tR과 tS에 대해서
- 만약 tR과 tS가 같은 attibute를 공유한다면, tR과 tS의 value가 같은 것만 뽑은 뒤 중복을 제거하여 tuple t를 만듦
- 'swe3003'을 듣는 학생들의 이름을 찾아보자
Πname(σc_id=′swe3003′(Student⋈Take))

Rename (ρ)
ρAFTER(BEFORE)
- 같은 테이블이 여러번 사용될 수 있기 때문에 필요함.

여기에서 Tom의 조부모를 찾기 위해서는, 다음과 같이 할 수 있음
σPC1.child=PC.parent(ρPC1(PC)×PC)
Division (÷)
- 다음과 같은 쿼리를 표현하는데 유리함
- 모든 CS 과목들을 수강한 학생들을 찾으세요.
- R이 두개의 attributes (x,y), S가 (y)를 갖는다면
- R÷S는 x들 중 모든 y와 매치되는 x의 집합을 반환함
- 예를 들어 R이 Friend(x,y)이고, S가 10명 학생의 집합이라면,
- R÷S는 모든 10명과 친구인 모든 x들의 집합을 반환함.

Observations
- Division ÷는 카테시안 곱의 역임
- 이는 기본 연산자로 표현할 수 있음
r÷s=π(R−S)(r)−π(R−S)[(π(R−S)(r)×s)−r]