관계형 모델

관계형 모델은 실제 세계의 데이터를 관계라는 개념을 사용해 표현한 데이터 모델이다. 일반적으로 ERD같은 설계 모델을 생각하는 사람이 많은데 실제로는 설계의 의미가 아니라 데이터를 어떻게 표한할까라는 개념의 의미이다.

릴레이션

ERD를 생각하는 사람에게서는 테이블 사이의 관계라고 생각하는데 이건 설계 관점에서 본것이므로 정답이 아니다. SQL에 있어서 릴레이션에 해당하는 것은 테이블이다. 릴레이션은 제목과 본체로 구성되어 있다. 제목은 속성이 0개 이상이 모인 집합이고, 속성은 이름과 데이터형으로 되어있다. 본체는 속성값의 집합인 행 또는 튜플의 집합이다.

튜플에 포함된 속성값은 이름과 데이터 형이 제목에서 지정한 것과 서로 일치하지 않으면 안된다. 제목에서 정의하지 않은 속성이 튜플에 존재하거나 반대인 경우에는 규칙 위반이다. 릴레이션이란 튜플의 집합이다. 튜플은 모두 같은 n개의 속성값의 집합으로 데이터 구성이 같다.

집합

수학에서 사용되는 개념으로 물건의 모임을 표현하는 개념이다. 각 물건은 요소나 원소라고 한다. 요소에는 특별한 제약이 없고 범용적인 구조로써 집합을 사용 할 수 있다.

집합의 충족 요소

  1. 어떤 요소가 집합에 포함돼 있는지 불확정한 요소 없이 판정할 수 있어야 한다.
  2. 집합의 요소가 중복돼서는 안 된다.
  3. 집합의 요소는 더는 분해될 수 없다.

관계형 모델과 NULL

릴레이션에 NULL을 포함할 수 없다. 관계형 모델을 올바르게 구현하려면 NULL은 배제해야한다.

릴레이션의 연산

데이터를 릴레이션이라고 표현한다면 그에 대한 연산은 쿼리(질의)다. 관계형 모델은 릴레이션 단위로 다양한 연산을 사용해 질의를 수행하는 데이터 모델이다. 릴레이션을 사용한 연산을 수행하므로 관계형 모델이라고 부른다.

제한(Restrict)

릴레이션들 중 특정 조건에 맞는 튜플을 포함한 릴레이션을 반환한다.

프로젝션(Projection)

릴레이션에서 특정 속성만 포함하는 릴레이션을 반환한다.

확장(Extend)

프로젝션과 반대로 속성을 늘리는 동작이다. 새로운 속성값은 기존의 속성값을 이용해 계산한다.

속성명 변경(Rename)

단순히 속성의 이름을 변경하는 동작이다.

합집합(Union)

두 개의 릴레이션에 포함된 모든 튜플로 구성된 릴레이션을 반환한다. 공통 속성이 있다면 중복 값은 제거된다.

교집합(Intersect)

두 개의 릴레이션에 모두 포함된 릴레이션을 반환한다.

차집합(Difference)

두 개의 릴레이션 중 한쪽의 릴레이션에만 포함되어 있는 튜플로 구성된 릴레이션을 반환한다.

곱집합(Product)

두 개의 릴레이션에 있는 튜플을 각각 조합한 릴레이션을 반환한다.

결합(Join)

공통된 속성을 가진 두 개의 릴레이션에서 공통된 속성값이 같은 튜플끼리 조합한 릴레이션을 반환한다. 일치하지 않는 튜플은 결과에서 제외된다. 이와 같은 형태의 결합을 SQL에서는 내부조인(INNER JOIN)이라고 한다. 외부 조인은 결과에 NULL이 포함될 가능성이 있으므로 릴레이션의 연산으로는 부적절하다.

클로저(Closure)

관계형 모델에서는 릴레이션을 사용한 연산 결과가 릴레이션이 된다. 정수와 정수와의 연산은 정수가 되고 또 그 정수는 다른 정수와 연산을 할 수 있다. 이처럼 연산의 입력과 출력이 같은 구데이터 구조를 가진 성질을 클로저라고 한다. 릴레이션도 마찬가지로 릴레이션과 릴레이션이 연산하면 결과값은 릴레이션이다. 이처럼 릴레이션의 연산만을 이용해 복잡한 연산을 표현할 수 있는게 관계형 모델의 진면목이라 할 수 있다.

관계형 모델의 데이터 형식

데이터 형식이란 각 속성이 어떤 값을 가질 것인지를 뜻한다. 관계형 모델은 문자 그대로 모델이므로 어떻게 사용할 수 있는지가 정해져 있을 뿐 어떻게 사용해야 한다는 모델을 사용하는 응용프로그램이 정해야한다.

변수

변수란 값을 대입할 수 있는 그릇이다. x라는 변수 값이 1이라는 정수이고 x에 다른 값을 대입해 내용이 변경될 수 있다.

도메인

변수에 넣을 수 있는 값은 무한정한 값이 아니고, 사용할 수 있는 범위가 한정되어 있다. 컴퓨터가 표현할 수 있는 데이터는 변경할 수 있는 한계가 있다. 즉 데이터 형식은 그 변수에 대입할 수 있는 값의 유한 집합이다. 관계형 모델에서는 데이터 형식은 도메인이라고 한다. 값이라는 것은 집합에서 각 요소들을 말한다. 변수라는 것은 요소들 중 하나를 선택한 것으로 해석한다. 집합 요소에는 변화 없지만 어떤 요소를 선택할 것인가는 시시각각 변한다. 그 집합 전체를 도메인이라고 한다.

관계형 모델에서는 튜플은 제목에서 정의된 요소중 하나이다. 릴레이션은 속성의 도메인의 곱집합에서 특정 튜플만 선택해 구성한 집합이다.

SQL에서 릴레이션 조작

관계형 모델과 대응 시켜 살펴본다.

SELECT

질의 기능은 전부 SELECT에 들어가 있다.

가장 간단한 쿼리는 다음과 같이 되어있다.

SELECT 칼럼의 목록
FROM 테이블의 목록
WHERE 검색 조건

칼럼의 목록은 프로젝션, 테이블의 목록은 곱집합, 검색조건은 제한이다. 이렇게 간단한 select에도 세개의 릴레이션 연산이 있는 것을 알 수 있다.

릴레이션의 연산중 중요한 것중 하나는 연산의 순서이다. 위의 쿼리는 다음 순서의 릴레이션 연산을 한다.

  1. 테이블의 목록 (곱집합)
  2. 검색 조건 (제한)
  3. 칼럼의 목록 (프로젝션)

그러나 실제 RDB에서는 옵티마이저가 최적화 해서 실행하기 때문에 실행 순서는 바뀔수가 있다. 여기서 말하는 연산 순서는 논리적인 의미이다.

INSERT

관계형 모델에서는 갱신이라는 개념이 존재하지 않는다. 릴레이션은 값이기 때문이다. C를 예를들자면 int a = 1 + 2라고 할 때 값은 변경되었지만 정수라는 집합의 요소에서는 벗어나지 않는다. 그러나 SQL에서는 집합에 요소를 변경할 수 있다. 이러한 현상은 테이블이 값과 변수 둘의 역할을 다 하고 있기 때문이다.

INSERT는 릴레이션을 해당 릴레이션에 새롭게 INSERT할 튜플을 추가하고 릴레이션과 바꾸는 작업에 해당한다. 즉 INSERT는 기존 릴레이션에 새롭게 추가되는 튜플만을 가지고 있는 릴레이션의 합집합이라고 볼 수 있다.

INSERT INTO 테이블이름 (칼럼1, 칼럼2, 칼럼3)
VALUES (1, 2, 3)

DELETE

INSERT가 합집합이라면 DELETE는 차집합이다.

DELETE FROM 테이블
WHERE 조건

전체 릴레이션에서 WHERE 절의 조건에 해당하는 튜플의 집합을 기존 릴레이션에서 차집합 연산을 하는 것과 같다.

UPDATE

UPDATE 테이블 이름
SET 칼럼 = 변경값, ...
WHERE 조건

전체 릴레이션에서 WHERE 절의 조건에 맞는 튜플 값을 갱신한다. 그러나 관계형 모델에서는 갱신이라는 개념이 없다. 정확하게 표현하자면 다음과 같다

  1. 전체 릴레이션에서 조건에 맞는 튜플로 이루어진 릴레이션의 차집합을 구한다
  2. where 조건에 맞게 구성된 릴레이션에 수정을 가한 릴레이션과의 합집합을 구한다
  3. 합집합을 relvar에 대입한다

관계형 데이터 모델에는 없고 SQL에는 있는 것

요소의 중복

릴레이션은 구조가 같은 튜플의 집합이다. 집합은 중복되지 않으므로 릴레이션도 마찬가지다.

그러나 SQL은 테이블에 같은 행이 있어도 괜찮다. 오류는 없다. 즉, SQL에서 테이블은 집합이 아니다. SQL을 관계형 모델에 맞게 사용하려면 테이블을 집합처럼 사용해야 한다.

요소 사이의 순서

집합은 요소사이의 순서가 없다. 그러나 SQL에는 순서가 있다. 칼럼은 정의된 순서대로 나열되고 행을 정렬할 수도 있다. 쿼리를 실행한 결과도 지정한 순서로 나열된다. 관계형 모델에 따라 사용하려면 행이나 칼럼의 위치를 고려한 쿼리를 작성하면 안된다. 예를들어 ROWNUM이나 ORDER BY 1 과 같은 기능이다.

릴레이션의 갱신

릴레이션은 값이므로 갱신할 수 없다. 테이블은 값과 변수의 기능을 모두 한다. 관계형 모델을 구성하는데 있어서 명확하게 구분을 해야한다.

트랜잭션

트랜잭션은 SQL 사양의 일부지만 관계형 모델과는 다른 개념이다. 트랜잭션은 여러개가 병렬로 실행된 갱신을 모순 없이 수행하기 위한 이론이다. 그러나 릴레이션은 갱신이 없으므로 아무런 관계가 없다.

ACID 특성

  • Atomicity원자성
  • Consistency 일관성
  • Isolation 독립성
  • Durability 내구성

스토어드 프로시저

관계형 모델에서는 프로시저가 존재하지 않는다.

NULL

관계형 모델에서 요소란 존재하면 포함하고 존재하지 않으면 포함하지 않는다. 그러나 SQL에서는 NULL을 사용해서 값이 없음을 표현한다. 이는 값이 아니다. 따라서 NULL은 집합에 표현할 수 없다.

Relvar

연산할때 중간중간의 결과들을 담는 테이블