Yunseok's Dev Blog

배운 것을 적는 블로그입니다.

관계형 모델이란 무엇인가?

관계형 모델이란?

관계형 모델은 실제 세계의 데이터를 관계라는 개념을 사용해서 표현한 데이터 모델이다. 관계형 모델을 이해하는데 가장 중요한 개념은 Relation(관계)이다.

왜 관계형 모델이 중요한가?

  • SQL은 관계형 모델을 기반으로 한 질의 언어이지만 관계형 모델을 충실하게 재현하지는 않는다. 관계형 모델을 모르고 SQL을 쓰면 제대로 사용할 수 없고 비효율적인 쿼리를 사용하게 된다. 관계형 모델에 따른 연산이 가장 좋다. 복잡하고 이상한 SQL 문은 가독성도 나쁘고 버그의 원인이 될 것이다.
  • DB 응용프로그램을 유지 보수 할 때도 관계형 모델에 관해서 이해하는 것이 중요하다.

Relaction이란?

Relation은 Heading과 Body로 구성돼 있다.

Heading은 Attribute가 n개 모인 집합이며, 이 Attribute는 이름과 데이터 형으로 되어 있다. Body는 속성값의 집합인 tuple의 집합이다.

튜플과 속성은 SQL에서는 row, column이라고 한다.

관계형 모델 SQL
릴레이션 테이블
튜플
속성 칼럼

집합이란?

집합은 수학에서 사용되는 개념으로 요소, 원소의 모임을 표현하는 개념이다. Relation도 집합의 한 종류이므로 집합이 가진 특성을 가진다.

집합의 요소에는 어떤 성질이든 상관없지만 충족해야 할 조건이 몇 가지 있다.

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

관계형 모델에서 NULL이란?

Relation에 NULL이 포함돼 있으면 관계형 모델은 성립하지 않는다. NULL은 값을 모르는 상태를 나타내는 표식이다. 따라서 NULL이 포함돼 있으면 Relation연산 결과가 항상 같아지지 않는다.

집합에서 알 수 없는 것을 포함할 수 없다. 따라서 집합의 한 종류인 릴레이션에서 NULL을 포함할 수 없다. 관계형 모델을 올바르게 구현하려면 NULL을 사용하지 않아야 한다.

Relation의 연산

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

Relation은 본질적으로 집합이며 그에 대한 연산도 집합론을 바탕으로 하고 있다.

Restrict

특정 조건에 맞는 튜플을 포함한 Relation을 반환. 결과는 Relation의 부분집합이다.

Projection

어떤 Relation에서 특정 속성만 포함하는 Relation을 반환. 중복이 발생할 수 있다. 집합에서는 중복되는 요소가 없으므로 중복이 발생한 경우 같은 튜플로 간주한다.

Extend

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

Rename

속성의 이름을 변경하는 것

Union

두 개의 Relation에 포함된 모든 튜플로 구성된 Relation(합집합)을 만든다. 만약 공통된 속성값이 포함됐다면 합집합은 중복 값이 제거된 상태가 된다.

Intersect

두 개의 Relation에 공통된 Relation을 반환한다.

Difference

두 개의 Relation 중에 한쪽에 Relation에만 포함되어 있는 튜플로 구성된 Relation을 반환한다. 어느 쪽의 Relation을 기준으로 하는지에 따라서 결과가 달라진다.

Product

두 개의 Relation에 있는 튜플은 각각 조합한 Relation을 반환하다.

Join

공통된 속성을 가진 두 개의 Relation에서 공통된 속성값이 같은 튜플끼리 조합한 Relation을 반환한다. 일치하지 않는 값이 존재하지 않는 튜플은 결과에서 제외된다.

SQL에서는 INNER JOIN이라고 하는데 관계형 모델에서 존재하는 것은 내부조인뿐이다. 외부조인은 결과에 NULL이 포함될 가능성이 있기 때문이다.

이것이 쿼리의 본질이다. 이 원리를 응용해 만들어진 것이 RDB다. RDB가 성능을 최대한 발휘하려면 이런 동작을 기반으로 SQL을 작성해야 한다.

클로저라는 성질

Relation을 사용한 연산 결과는 Relation이다. 이처럼 연산의 입력과 출력이 같은 데이터 구조를 가진 성질을 클로저라고 한다.

연산 결과가 Relation이라면 그 결과를 다른 Relation과 조합해 연산할 수 있다.

관계형 모델의 데이터 형식

데이터 형식이란 각 속성이 어떤 값을 가질 것인지를 말한다. 테이블을 설계할 때 데이터 형식을 고려하지 않는 경우는 없다고 생각한다.

데이터 형식은 그 변수에 대입할 수 있는 값의 유한집합이다. 관계형 모델에서 데이터 형식은 도메인이라고 한다. 도메인이 유한집합이라는 것은 튜플이 취득할 수 있는 값을 그 유한집합의 곱집합으로 나타낼 수 있다는 말이다. 관계형 모델은 Relation을 구성하는 제목, 본체, 튜플뿐만 아니라 속성의 데이터 형식조차도 집합으로 되어 있다.

SQL에서 Relation 조작

SELECT

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

간단한 SELECT는 세 개의 Relation연산을 동시에 수행한다.

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

INSERT

INERT는 합집합이다.

DELETE

DELETE는 차집합이다.

UPDATE

UPDATE는 차집합에서 본래 튜플과의 합집합이다.

SQL과 관계형 모델의 차이

요소의 중복

집합은 중복되지 않으므로 Relation도 마찬가지로 중복이 없다. 하지만 SQL은 테이블에 같은 행이 있더라도 괜찮다. SQL을 관계형 모델에 맞게 사용하려면 테이블을 집합처럼 사용해야 한다. 적어도 어딘가 유일성 제약이 있어야 한다.

요소 사이의 순서

집합은 요소 사이의 순서가 없다. 따라서 집합으로 정의된 Relation, 튜플, heading에 포함된 요소에는 순서가 없다. 하지만 SQL에는 순서가 있다. 따라서 관계형 모델에 따라 SQL을 사용하려면 행이나 칼럼의 위치를 고려한 쿼리를 작성해서는 안 된다.

Relation의 갱신

Relation은 값이므로 갱신할 수 없다. 테이블은 값과 변수의 기능을 모두 겸한다.

트랜잭션

관계형 모델과는 다른 독립적인 개념으로 관계형 모델에 포함되지 않는다.

Stored procedure

관계형 모델에는 프로시저가 존재하지 않는다. 따라서 커서를 루프로 처리하는 작업은 관계형 모델에서는 없다.

NULL

집합에는 NULL이라는 개념이 없다.

모두 이해했다면 다음 질문에 답해보자.

  1. 관계형 모델이란 무엇인가?
  2. Relation이란 무엇인가?
  3. 집합이란 무엇인가?
  4. 관계형 모델에서 왜 NULL이 포함되지 않는가?
  5. SQL과 관계형 모델의 차이는?

Source