Database - 2(2)

김세영·2021년 4월 15일
0

Relational Algebra

Relational Algebra - 관계대수

  • Procedure Language는 몇 가지의 연산을 입력으로 받아 그 결과를 제공합니다.
  • 그 연산에는 6가지 종류가 있습니다.
    • select: σ
    • project: ∏
    • Cartesian product: X
    • union: ∪
    • set difference: -
    • rename: ρ
  • Relation은 6가지 연산에 대해 모두 닫혀있습니다. 연산의 처리 결과가 relation이며, 다른 연산의 입력으로 주어질 수 있습니다.
    (자세한 내용은 Project 참조)

Select -> σp(r)

Selectr에서 주어진 조건을 만족하는 튜플들을 반환해줍니다.

  • ex) σdept_name="Physics"(instructor)

    instructor 테이블에서 소속 학과가 Physics인 튜플을 모두 선택해주세요

  • 조건에는 비교 및 논리 연산을 섞어 사용할 수 있습니다.

    • = ≠ > < ≥ ≤
    • ∧(and) ∨(or) ¬(not)
    • ex) σdept_name = "Physics" ∧ salary > 90000(instructor)

      instructor테이블에서 소속학과가 Physics이고 연봉이 90000이 넘는 튜플을 모두 선택해주세요
  • 조건에 각 attribute들끼리 비교할 수도 있습니다.

    • ex) σdept_name = building(department)

      department 테이블에서 소속 학과 이름이 건물 이름과 동일한 튜플을 모두 선택해주세요

Project -> ∏A1, A2, ..., Ak(r)

Projectr에서 A1, A2, ..., Ak에 해당하는 attribute들을 반환해줍니다.

  • ex) ∏ID, name, salary(instructor)

    instructor 테이블에서 ID, name, salary들만 뽑아서 보여주세요

  • r에 테이블이 아닌 연산 결과를 넣을 수 있습니다.

    • ex) ∏name(σdept_name="Physics"(instructor))

      instructor 테이블에서 소속 학과가 Physics인 튜플들의 name만 뽑아서 보여주세요

Cartesian Product -> r1 X r2

Cartesian Productr1, r2에서 조합 가능한 모든 경우를 합쳐줍니다.

  • ex) [{1, 2}] X [{3, 4}] = [{1, 3}, {1, 4}, {2, 3}, {2, 4}]

  • Attribute이름이 r1, r2에서 겹친다면, 구분하여 합쳐줍니다.

    • ex) instructor의 ID, teaches의 ID가 겹칠 때

      instructor X teaches -> instructor.ID, teaches.ID로 합쳐줍니다.
  • Cartesian Product는 필요한 정보를 가져올 때, 그 양에 비해 생성되는 테이블이 너무 크다는 단점이 있습니다.
    이를 보완하기 위해, 기본 연산에는 포함되지 않지만 Join 연산이 등장하였습니다.

Join -> r ⋈θ s ( = σθ(r X s) )

Joinr X s에서 원하는 정보만 조건으로 선별해 튜플들로 반환합니다.

  • ex) instructor ⋈instructor.ID = teaches.IDteaches

    • 이는 σinstructor.ID = teaches.ID(instructor X teaches)와 동일하며,
      instructor X teaches 에서 instructor.IDteaches.ID가 일치하는 튜플을 모두 선택해주세요 라는 의미입니다.

Union -> r ∪ s

Union은 두 테이블을 합쳐줍니다.

  • Union이 가능하려면 다음 두 가지 조건을 갖추어야 합니다.

    • r, s는 attribute의 개수(arity)가 일치해야 합니다.
    • 각 attribute의 Domain이 호환 가능해야 합니다.
  • ex) ∏course_id(σsemester = "Fall" ∧ year = 2017(section)) ∪ ∏course_id(σsemester = "Spring" ∧ year = 2018(section))

    section 테이블에서 2017년 가을학기의 course_id와 2018년 봄학기의 course_id를 합쳐서 보여주세요

Set Difference -> r - s

Set diferencer에 있는 값들 중 s에 있는 값들을 제거한 결과를 반환합니다.

  • Set difference는 Union과 연산 가능 조건이 일치합니다.

  • ex) ∏course_id(σsemester = "Fall" ∧ year = 2017(section)) - ∏course_id(σsemester = "Spring" ∧ year = 2018(section))

    section 테이블에서 2017년 가을학기의 course_id중 2018년 봄학기에도 있는 course_id는 제외하여 보여주세요

Rename -> ρx(E)

Rename은 E의 값들의 이름을 x로 바꾸어줍니다. 이는 모든 Combining시에, 두 테이블의 attribute에서 이름이 같은 값들이 있다면
이름 충돌이 빈번히 일어나므로 Renaming을 사용하여 충돌을 막아줄 수 있기 때문에 사용합니다.

  • ex) instructor = (ID, name, dept_name, salary), teaches = (ID, course_id, sec_id, semester, year)

    • instructor X teaches = (instructor.ID, name, ..., teaches.ID, course_id, ..., year) <ID 이름 충돌>
    • instructor X ρ(t_ID, course_id, sec_id, semester, year)(teaches)
      = (ID, name, dept_name, ..., t_ID, course_id, ..., year) <이름 충돌 X>

etc

  • σdept_name = "Physics" ∧ salary > 90000(instructor)

  • σdept_name = "Physics"(σsalary > 90000(instructor))

위 두 연산의 결과는 같습니다.
절차는 다르지만 결과가 같을 때: equivalent, 절차와 결과가 같을 때: identical 이라 하고,
따라서 위의 수식은 equivalent하지만 identical하지 않습니다.

profile
초보 iOS 개발자입니다ㅏ

0개의 댓글