본문으로 건너뛰기

관계해석

정보처리기사 목차데이터베이스와 관계 모델레슨 81 / 233

목차

관계해석(relational calculus)은 원하는 결과의 조건만 적는 데이터 언어입니다. 연산의 순서를 적지 않으므로 비절차적 언어라고 하고, 조건에는 '모든'을 뜻하는 ∀와 '존재한다'를 뜻하는 ∃를 씁니다. 변수가 튜플이면 튜플 관계해석, 속성 값이면 도메인 관계해석입니다.

앞 레슨의 관계대수: 셀렉트·프로젝트·조인·디비전은 '먼저 3학년을 고르고, 다음에 이름만 남겨라'처럼 연산의 순서를 적었습니다. 그런데 우리가 아는 것은 보통 순서가 아니라 '원하는 결과가 어떤 것인가'입니다. 관계해석은 그 조건만 적습니다. 어떤 연산을 어떤 순서로 할지는 적지 않습니다. 코드(E. F. Codd)가 관계 데이터 모델과 함께 제안했고, 수리 논리의 술어 해석을 데이터베이스에 가져온 것입니다. 조건만 적는다는 점에서 13단원부터 배우는 SQL이 관계해석을 닮았습니다. 시험은 둘 가운데 어느 쪽이 절차적인지와 ∀·∃의 뜻을 묻습니다.

7단계 중 1단계. 같은 물음을 관계대수와 관계해석으로 적어 봅니다. 적는 방식이 다릅니다.

1절차적 언어와 비절차적 언어

같은 물음을 관계대수와 관계해석으로 적어 봅니다. 물음은 '3학년 학생의 이름'입니다. 적는 방식이 다릅니다.

관계대수는 먼저 3학년을 고르고 다음에 이름만 남기라고, 연산의 순서까지 적습니다. 식은 π 이름 (σ 학년=3 (학생))입니다. 이렇게 과정을 적는 언어를 절차적 언어라고 합니다.

관계해석은 원하는 튜플의 조건만 적습니다. 어떤 연산을 어떤 순서로 할지는 적지 않습니다. 이렇게 결과만 적는 언어를 비절차적 언어라고 합니다. 식은 아래와 같습니다. 세로줄 앞은 결과로 내보낼 것, 뒤는 조건입니다. t는 학생 릴레이션의 튜플을 가리키는 변수입니다.

{ t.이름 |
  학생(t) ∧ t.학년 = 3 }

조건에 쓰는 논리 기호는 넷입니다. ∧는 '그리고', ∨는 '또는', ¬는 '아니다'이고, →는 '앞이 참이면 뒤도 참이어야 한다'는 함의(implication)입니다. 조건이 '…라면 …이다' 꼴일 때 →를 씁니다.

두 언어는 적는 방식만 다르고 나타낼 수 있는 질의의 범위가 같습니다. 그래서 관계대수로 적을 수 있는 질의는 관계해석으로도 적을 수 있습니다. 위 두 식의 결과는 똑같이 김민수·최민준·정하윤입니다.

2정량자 ∃와 ∀

∃는 조건에 맞는 것이 하나라도 있으면 참이라는 뜻입니다. 존재 정량자(existential quantifier)라고 읽습니다. '수강 행이 하나라도 있다'처럼 한 건만 찾으면 되는 조건에 씁니다.

∀는 모든 것에 대해 조건이 참이어야 한다는 뜻입니다. 전칭 정량자(universal quantifier)라고 읽습니다. '과목 모두를 들었다'처럼 빠짐없이 성립해야 하는 조건에 씁니다. 앞 레슨에서 디비전으로 구한 '과목 셋을 모두 들은 학생 101'을 관계해석에서는 ∀로 적습니다.

∀는 '어기는 것이 하나도 없다'로 바꿔 읽으면 헷갈리지 않습니다. '그 학생의 수강 행이라면 모두 85점 이상이다'를 ∀와 →로 적으면, 85점에 못 미치는 수강 행이 하나도 없을 때 참입니다. 그래서 수강 행이 아예 없는 학생도 이 조건을 만족합니다. 견줄 것이 없으면 어기는 것도 없기 때문입니다.

3튜플 관계해석과 도메인 관계해석

변수가 튜플을 가리키면 튜플 관계해석(tuple relational calculus), 속성 값을 가리키면 도메인 관계해석(domain relational calculus)입니다. 앞에서 본 관계해석 식의 t는 튜플이라 튜플 관계해석입니다. 같은 물음을 도메인 관계해석으로 적으면 아래와 같습니다. 학생의 속성 네 자리에 변수를 놓고, 내보낼 변수 n만 세로줄 앞에 둡니다.

{ n | ∃a∃b∃c(학생(a, n, b, c)
    ∧ b = 3) }

예제

두 언어를 가르는 기준

보는 곳관계대수관계해석
적는 것연산과 그 순서원하는 튜플의 조건
갈래절차적비절차적
쓰는 기호σ π ⋈ ÷ ∪ ∩ − ×∧ ∨ ¬ → ∀ ∃
변수쓰지 않는다튜플 또는 속성 값
나타낼 수 있는 질의같다같다

관계해석 식은 돌려 볼 수 없습니다. 아래 예제는 같은 뜻을 SQL로 적어 결과를 확인한 것입니다.

∃로 적은 조건

물음은 '학점이 3인 과목을 들은 학생의 이름'입니다. 한 과목만 들었어도 되므로 ∃를 씁니다. 수강 튜플 u와 과목 튜플 v가 존재해서, u가 그 학생의 수강이고 u와 v의 과목코드가 같으며 v의 학점이 3이면 됩니다.

{ t.이름 | 학생(t) ∧
  ∃u∃v(수강(u) ∧ 과목(v)
    ∧ u.학번 = t.학번
    ∧ u.과목코드 = v.과목코드
    ∧ v.학점 = 3) }

SQL의 EXISTS가 ∃와 같은 일을 합니다. SQL은 14단원 서브쿼리에서 배우니, 여기서는 결과 표가 식의 결과와 같은지만 봐도 됩니다.

SELECT S.이름
FROM 학생 S
WHERE EXISTS (
  SELECT *
  FROM 수강 E, 과목 C
  WHERE E.학번 = S.학번
    AND E.과목코드 = C.과목코드
    AND C.학점 = 3
)
ORDER BY S.이름;
이름
김민수
김지민
박서연
이서준
최민준

학점이 3인 과목은 자료구조(DS)와 운영체제(OS)입니다. 둘 가운데 하나라도 들은 학생이 다섯 명입니다. 수강이 없는 정하윤(106)과 네트워크만 들은 강도현(107)은 빠집니다.

시험 포인트

  • 필기: 관계대수는 연산과 그 순서를 적는 절차적 언어, 관계해석은 원하는 결과의 조건을 적는 비절차적 언어입니다. 어느 쪽이 절차적인지 바꿔 묻는 문제가 나옵니다. 둘은 나타낼 수 있는 질의의 범위가 같습니다. 관계해석은 코드(E. F. Codd)가 제안했고 수리 논리의 술어 해석에 바탕을 둡니다. 변수가 튜플이면 튜플 관계해석, 속성 값이면 도메인 관계해석입니다. ∀는 '모든', ∃는 '존재한다'로 읽고, 조건은 ∧(그리고)·∨(또는)·¬(아니다)·→(…이면 …이다)로 잇습니다. ∀는 어기는 것이 하나도 없으면 참이라, 견줄 행이 하나도 없는 튜플도 ∀ 조건을 만족합니다.
  • 실기: 이름을 씁니다 — 관계해석(Relational Calculus)·전칭 정량자(Universal Quantifier, ∀)·존재 정량자(Existential Quantifier, ∃).

확인 문제

1. 카드 (가)~(마)를 관계대수와 관계해석 두 바구니로 나누세요. 바구니마다 카드 기호를 쓰세요.

  • (가) 두 릴레이션을 잇고 속성을 고르는 연산을 이어 붙여 적는다
  • (나) 변수가 튜플인 꼴과 속성 값인 꼴로 나뉜다
  • (다) ∀와 ∃로 '모두'와 '하나라도'를 적는다
  • (라) '빠짐없이 가진 튜플'을 ÷ 하나로 적는다
  • (마) 원하는 결과를 어떤 순서로 얻을지 적지 않는다
정답

받는 답: 관계대수 (가)·(라) · 관계해석 (나)·(다)·(마)

가르는 기준은 '과정을 적는가, 결과의 조건을 적는가'입니다.

  • (가) 연산을 이어 붙여 과정을 적었습니다.
  • (나) 튜플 관계해석과 도메인 관계해석입니다.
  • (다) 정량자는 조건을 적는 기호입니다.
  • (라) ÷는 관계대수의 연산 기호입니다. 같은 물음을 관계해석에서는 ∀로 적습니다.
  • (마) 순서를 적지 않는 쪽이 비절차적 언어입니다.

2. (가)~(다)에 맞는 이름을 한글 이름과 영문으로 함께 쓰세요. 기호가 있으면 기호까지 쓰세요. 답을 끝까지 쓴 뒤 정답을 펼치세요.

  • (가) '이 학생의 수강 행이 하나라도 있다'를 조건으로 적을 때 쓰는 기호의 이름
  • (나) '과목 셋에 대해 모두 성립한다'를 조건으로 적을 때 쓰는 기호의 이름
  • (다) 코드(E. F. Codd)가 관계 데이터 모델과 함께 제안했고, 변수가 튜플인 꼴과 속성 값인 꼴로 나뉘는 데이터 언어의 이름
정답

받는 답: (가) 존재 정량자(Existential Quantifier, ∃) · (나) 전칭 정량자(Universal Quantifier, ∀) · (다) 관계해석(Relational Calculus)

(가)의 실마리는 '하나라도 있다', (나)는 '모두 성립한다', (다)는 '두 꼴로 나뉜다'입니다.

  • 같은 이름의 다른 꼴: ∃·∀처럼 기호만 쓴 꼴 — 문제가 이름을 함께 쓰라고 했습니다.
  • 틀리는 꼴 전칭 정량자 — (가)에: 모든 것에 대해 참이어야 한다는 기호입니다. 한 건만 찾으면 되는 조건은 존재 정량자입니다.
  • 틀리는 꼴 관계대수 — (다)에: 연산과 그 순서를 적는 언어이고, 변수를 쓰지 않습니다.
  • 틀리는 꼴 튜플 관계해석 — (다)에: 두 꼴 가운데 하나입니다. 둘을 함께 아우르는 이름을 묻고 있습니다.

3. 다음 두 식의 결과를 쓰세요. 몇 명인지까지 쓰세요. 식이 보는 두 표는 아래와 같습니다.

학생 표

학번이름
101김민수
102이서준
103김지민
104박서연
105최민준
106정하윤
107강도현

수강 표

학번과목코드점수
101DS85
101OS75
101NW80
102DS70
102OS60
103DS65
103NW55
104OS75
104NW95
105DS100
105NW90
107NW50
(가) { t.이름 | 학생(t)
       ∧ ∃u(수강(u)
         ∧ u.학번 = t.학번
         ∧ u.점수 >= 85) }

(나) { t.이름 | 학생(t)
       ∧ ∀u(수강(u)
         ∧ u.학번 = t.학번
         → u.점수 >= 85) }
정답

(가) 김민수·박서연·최민준, 3명 · (나) 최민준·정하윤, 2명입니다.

  • (가) 85점 이상인 수강이 하나라도 있으면 됩니다. 김민수(자료구조 85), 박서연(네트워크 95), 최민준(자료구조 100)입니다.
  • (나) 그 학생의 수강이 모두 85점 이상이어야 합니다. 최민준은 100·90이라 남고, 김민수는 운영체제 75가 있어 빠집니다.
  • (나)의 정하윤은 수강 행이 하나도 없습니다. 조건을 어기는 수강이 없으므로 ∀가 참입니다. ∀는 '어기는 것이 하나도 없다'로 읽으면 이런 경우를 놓치지 않습니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

정보처리기사 목차로