Computers/Databases

ch 6. Formal Relational Query Languages (Part 2. Tuple Relational Calculus & Domain Relational Calculus)

emzei 2016. 7. 11. 15:09
Part 2. Tuple Relational Calculus & Domain Relational Calculus

  • 관계대수는 기호의 순서에 따라, 절차에 맞게 처리해야하기 때문에 순차적이다. 하지만 6장의 관계대수 부분 다음에 나오는 아래 이야기들은 표현의 절차를 없앰으로써, 비절차적으로 수행할 수 있음을 보여준다.
  • 관계 대수에 비하여 큰 비중을 차지하지 않으나, 어떤 개념인지 파악하고 넘어가면 좋을 것 같다.


Tuple Relational Calculus (튜플 관계 해석)
  • 비절차적 쿼리 언어로서, 각 쿼리는 다음과 같은 형태를 지닌다.
    • (db1)
  • 이 것은 조건 P를 만족하는 모든 t에 대한 집합을 나타낸다.
  • t는 튜플변수로서, t[A]는 속성 A에 대한 튜플 t의 값을 나타낸다
    • T[ID], t[dept_name], t[salary]
  • t ∈ r 은 릴레이션 r에 t가 속함을 나타낸다.
  • P는 식(formula)으로서, predicate calculus와 유사하다.
  • 튜플 관계 해석이란, 즉, 사용자가 원하는 정보를 얻는 방법은 명시하지 않고, 원하는 정보의 내용만 기술함을 의미한다.

  • Pedicate Calculus Formula 는 다음과 같이 정의한다
    • 1. 속성과 상수의 집합
    • 2. 비교 연산자의 집합 
    • 3. 연결자의 집합 ; and, or, not
    • 4. 암시 (implication); x ⇒ y : x가 참이면 y도 참.
      • X (참)  ⇒ Y (참) : 참
      • X (참)  ⇒ Y (거짓) : 거짓
      • X (거짓)  ⇒ Y (참) : 참
      • X (거짓)  ⇒ Y (거짓) : 참
    • 5. 한정자의 집합
      • 어떤 t에 대해~
      • 모든 t에 대해~



  • 쿼리 예제 1-1 :  salary가 80000보다 큰 instructor의 ID, name, dept_name, salary를 찾아라
    • {t | t ∈ instructor  ⋀ t [salary] > 80000)}
  • 쿼리 예제 1-2 : 이전 쿼리에서, 오직 ID 속성값만 출력하라
    • {t | ∃ s ∈ instructor (t [ID] = s [ID] ⋀ s [salary] > 80000)}
    • (cf. t는 ID 속성에만 정의되어있으므로, ID만 결과로 출력)
  • 쿼리 예제 2 : instructor의 department가 Watson 건물에 있다면, 해당 instructor의 name을 모두 출력하라
    • {t | ∃ s ∈ instructor (t [name] = s [name] ⋀ ∃ u ∈ department (u [dept_name] = s[dept_name] ⋀ u[building]=“Watson”))}
  • 쿼리 예제 3 : 2009 년 가을(fall) 학기에 개설되었거나, 2010년 봄(spring) 학기에 개설되었던 모든 course를 출력하라
    • {t | ∃ s ∈ section (t [course_id ] = s [course_id ] ⋀ s [semester] = “Fall” ⋀ s [year] = 2009 v ∃ u ∈ section (t [course_id ] = u [course_id ] ⋀ u [semester] = “Spring” ⋀ u [year] = 2010)}


Safety of Expressions (표현의 안정성)
  • 튜플 대수 식을 씀으로써 무한정의 릴레이션을 생성할 수 있다.
  • 예를 들어서, {t | ¬ t ∈ r} 은, 릴레이션 r의 속성의 범위가 무한일 경우, 무한 릴레이션을 낳는다. (r에 속하지 않는 튜플의 수!?!! 무한...ㅇㅅㅇ?!!!)
  • 이러한 문제를 해결하기 위해선, 안전한 표현을 위해 허용가능한 식을 제한해야 함.
  • 만약에 t의 모든 컴포넌트가 P에 속하는 릴레이션/튜플/상수 중 한 곳에서 나타난다면, 관계 대수에서 {t | P(t)} 식은 안전하다고 할 수 있다.


Universal Quantification
  • Biology 학과에서 개설한 모든 과목을 수강한 모든 학생을 찾아라
    • {t | ∃ r ∈ student (t [ID] = r [ID]) ⋀
      (∀ u ∈ course (u [dept_name]=“Biology”
      ⇒ ∃ s ∈ takes (t [ID] = s [ID ] ⋀ s [course_id] = u [course_id] ) ) }
    • cource 릴레이션의 모든 튜플 U에 대해, 만약 u의 dept_name속성 값이 “biology”이면, 학생 ID와 course_id를 포함하는 takes 릴레이션 튜플이 존재한다.



Domain Relational Calculus

  • 비절차적 쿼리 언어는 튜플 관계 대수와 그 영향력이 같다.
  • 각 쿼리는 다음과 같은 형식으로 표현된다 :
    • { < x1, x2, … , xn > | P(x1, x2, …, xn)}
  • x1, x2, …, xn 은 도메인 변수를 나타낸다.
    • 전체 튜플 값 대신에 속성의 도메인으로부터의 값들을 취함
  • P는 predicate calculus와 유사한, 하나의 식이다.
  • 쿼리 예제 1-1 :  salary가 80000보다 큰 instructor의 ID, name, dept_name, salary를 찾아라
    • { <i, n, d, s> | <i,n,d,s> ∈ instructor  ⋀ s > 80000)}
  • 쿼리 예제 1-2 : 이전 쿼리에서, 오직 ID 속성값만 출력하라
    • { <i> | <i,n,d,s> ∈ instructor  ⋀ s  > 80000 } (도메인 관계해석)
    • { t  | ∃ s ∈ instructor (t [ID] = s[ID] ⋀ s[salary]  > 80000) } 
  • 쿼리 예제 2 : instructor의 department가 Watson 건물에 있다면, 해당 instructor의 name을 모두 출력하라
    • { <n> | ∃ i,d,s ( <i,n,d,s> ∈ instructor ⋀ ∃ b,a (<d,b,a>  ∈ department  ⋀ b =“Watson”))}