관계형 모델은 실제 세계의 데이터를 관계
라는 개념을 사용해서 표현한 데이터 모델
이다. 관계형 모델을 이해하는데 가장 중요한 개념은 Relation(관계)이다.
Relation은 Heading과 Body로 구성돼 있다.
Heading은 Attribute가 n개 모인 집합이며, 이 Attribute는 이름과 데이터 형으로 되어 있다. Body는 속성값의 집합인 tuple의 집합이다.
튜플과 속성은 SQL에서는 row, column이라고 한다.
관계형 모델 | SQL |
---|---|
릴레이션 | 테이블 |
튜플 | 행 |
속성 | 칼럼 |
집합은 수학에서 사용되는 개념으로 요소, 원소의 모임을 표현하는 개념이다. Relation도 집합의 한 종류이므로 집합이 가진 특성을 가진다.
집합의 요소에는 어떤 성질이든 상관없지만 충족해야 할 조건이 몇 가지 있다.
Relation에 NULL이 포함돼 있으면 관계형 모델은 성립하지 않는다. NULL은 값을 모르는 상태를 나타내는 표식이다. 따라서 NULL이 포함돼 있으면 Relation연산 결과가 항상 같아지지 않는다.
집합에서 알 수 없는 것을 포함할 수 없다. 따라서 집합의 한 종류인 릴레이션에서 NULL을 포함할 수 없다. 관계형 모델을 올바르게 구현하려면 NULL을 사용하지 않아야 한다.
데이터를 Relation이라고 표현한다면 그에 대한 연산은 쿼리다. 관계형 모델은 Relation 단위로 다양한 연산을 사용해 쿼리를 수행하는 데이터 모델이다. Relation을 사용한 연산을 수행하므로 관계형 모델이라고 부른다.
Relation은 본질적으로 집합이며 그에 대한 연산도 집합론을 바탕으로 하고 있다.
특정 조건에 맞는 튜플을 포함한 Relation을 반환. 결과는 Relation의 부분집합이다.
어떤 Relation에서 특정 속성만 포함하는 Relation을 반환. 중복이 발생할 수 있다. 집합에서는 중복되는 요소가 없으므로 중복이 발생한 경우 같은 튜플로 간주한다.
프로젝션과는 반대로 속성을 늘리는 동작. 기존의 속성값을 이용해 새로운 속성값을 만든다.
속성의 이름을 변경하는 것
두 개의 Relation에 포함된 모든 튜플로 구성된 Relation(합집합)을 만든다. 만약 공통된 속성값이 포함됐다면 합집합은 중복 값이 제거된 상태가 된다.
두 개의 Relation에 공통된 Relation을 반환한다.
두 개의 Relation 중에 한쪽에 Relation에만 포함되어 있는 튜플로 구성된 Relation을 반환한다. 어느 쪽의 Relation을 기준으로 하는지에 따라서 결과가 달라진다.
두 개의 Relation에 있는 튜플은 각각 조합한 Relation을 반환하다.
공통된 속성을 가진 두 개의 Relation에서 공통된 속성값이 같은 튜플끼리 조합한 Relation을 반환한다. 일치하지 않는 값이 존재하지 않는 튜플은 결과에서 제외된다.
SQL에서는 INNER JOIN이라고 하는데 관계형 모델에서 존재하는 것은 내부조인뿐이다. 외부조인은 결과에 NULL이 포함될 가능성이 있기 때문이다.
이것이 쿼리의 본질이다. 이 원리를 응용해 만들어진 것이 RDB다. RDB가 성능을 최대한 발휘하려면 이런 동작을 기반으로 SQL을 작성해야 한다.
Relation을 사용한 연산 결과는 Relation이다. 이처럼 연산의 입력과 출력이 같은 데이터 구조를 가진 성질을 클로저라고 한다.
연산 결과가 Relation이라면 그 결과를 다른 Relation과 조합해 연산할 수 있다.
데이터 형식이란 각 속성이 어떤 값을 가질 것인지를 말한다. 테이블을 설계할 때 데이터 형식을 고려하지 않는 경우는 없다고 생각한다.
데이터 형식은 그 변수에 대입할 수 있는 값의 유한집합이다. 관계형 모델에서 데이터 형식은 도메인이라고 한다. 도메인이 유한집합이라는 것은 튜플이 취득할 수 있는 값을 그 유한집합의 곱집합으로 나타낼 수 있다는 말이다. 관계형 모델은 Relation을 구성하는 제목, 본체, 튜플뿐만 아니라 속성의 데이터 형식조차도 집합으로 되어 있다.
SELECT 칼럼의 목록
FROM 테이블의 목록
WHERE 검색 조건
간단한 SELECT는 세 개의 Relation연산을 동시에 수행한다.
INERT는 합집합이다.
DELETE는 차집합이다.
UPDATE는 차집합에서 본래 튜플과의 합집합이다.
집합은 중복되지 않으므로 Relation도 마찬가지로 중복이 없다. 하지만 SQL은 테이블에 같은 행이 있더라도 괜찮다. SQL을 관계형 모델에 맞게 사용하려면 테이블을 집합처럼 사용해야 한다. 적어도 어딘가 유일성 제약이 있어야 한다.
집합은 요소 사이의 순서가 없다. 따라서 집합으로 정의된 Relation, 튜플, heading에 포함된 요소에는 순서가 없다. 하지만 SQL에는 순서가 있다. 따라서 관계형 모델에 따라 SQL을 사용하려면 행이나 칼럼의 위치를 고려한 쿼리를 작성해서는 안 된다.
Relation은 값이므로 갱신할 수 없다. 테이블은 값과 변수의 기능을 모두 겸한다.
관계형 모델과는 다른 독립적인 개념으로 관계형 모델에 포함되지 않는다.
관계형 모델에는 프로시저가 존재하지 않는다. 따라서 커서를 루프로 처리하는 작업은 관계형 모델에서는 없다.
집합에는 NULL이라는 개념이 없다.
자바스크립트로 직접 만들면서 배우는 - 자료구조와 알고리즘 강의 바로 가기
실습으로 마스터하는 OAuth 2.0: 기본부터 보안 위험까지 - OAuth 2.0 강의 바로 가기
기계인간 이종립, 소프트웨어 개발의 지혜 - Git 강의 바로 가기
코드숨에서 매주 스터디를 진행하고 있습니다. 메일을 등록하시면 새로운 스터디가 시작될 때 알려드릴게요!