데이터의 무결성
데이터 모델
우리는 모델, 혹은 모델링이라는 단어를 자주 접하게 됩니다. 3차원 모델, 모델 하우스 등으로 말이죠. 이러한 모델의 특징은 무엇일까요? 바로 실제의 것은 아니라는 것입니다. 그러나 실제를 닮았다는 것입니다.
모델은 실제 현상의 필요한 점을 단순화하여 이해하기 쉽게 만드는 역할을 한다.
우리가 다루려는 데이터 모델도 당연히 무언가를 단순화한 것입니다. 그렇다면 어떤 것을 단순화 한 것일까요? 실세계에 존재하는 개체들, 그리고 그들간의 관계를 단순화한 것입니다.
데이터 모델은 복잡한 실세계를 단순화하여 실세계에 존재하는 개체들, 그리고 그들 간의 관계를 정의한 것을 의미한다.
교재에서 언급한 데이터 모델의 종류는 여러 가지가 있지만, 이번 학기에는 관계 데이터 모델(relational data model) 을 주로 다루므로, 관계 데이터 모델에 대해서만 알아보겠습니다.
관계 데이터 모델 (relational data model)
관계 데이터 모델은 매우 단순하고 직관적이며, 이해하기 쉬운 구조입니다. 개체의 모든 데이터를 2차원의 테이블 형태로 표현하고, 데이터간의 관계는 포인터가 아니라 기본키와 외래키를 통해서 구현합니다. 그래서 이전 데이터 모델과는 달리 데이터를 추가하거나 삭제, 수정하는 등의 작업이 쉽고, 필요에 따라 테이블간의 연결을 수정해 데이터간의 관계를 수정하기도 합니다. 이러한 데이터 모델의 출시 초기에는 속성값을 이용해 관계를 표현하므로 포인터를 이용하는 다른 데이터 모델에 비해 느리다는 지적을 받았으나, 하드웨어 기술의 발달로 현재는 크게 문제되지 않습니다.
관계 데이터 모델은 이러한 형태입니다.
ANSI-SPARC 구조
ANSI는 미국의 표준 협회로 한국의 KS에 상응하는 협회인데, 1975년 데이터베이스의 설계 표준안을 제시했습니다. 데이터베이스를 보는 관점에 따라 세 개의 레벨로 구성되어 있어 3레벨 구조, 혹은 3계층 구조라고 부릅니다.
3레벨 구조가 제시되는 목적은, 일반적인 사용자들은 데이터베이스가 어떻게 구성되어 있는지 알 필요가 없다는 것을 나타내기 위함입니다. 즉, 사용자들의 뷰와 데이터베이스의 실제 구현 내용을 분리할 수 있습니다.
ANSI-SPARC 구조
- 외부 수준: 각 사용자의 뷰
- 개념 수준: 데이터베이스 전체 구조의 정의
- 내부 수준: 데이터베이스의 물리적인 저장에 관한 정의
그림으로 표현하면 다음과 같습니다.
이렇게 단계별로 데이터베이스를 구분하며, 궁극적인 목적인 데이터 독립성이 구현됩니다.
- 논리적 데이터 독립성: 개념 수준의 변화로부터 외부 수준이 영향을 받지 않음을 의미
- 물리적 데이터 독립성: 내부 수준의 변화가 개념적 수준에 영향을 미치지 않음을 의미
릴레이션 관련 용어 정리
- 릴레이션: 행과 열로 되어 있는 2차원의 테이블
- 투플: 릴레이션의 각 행
- 애트리뷰트: 릴레이션에서 이름을 가진 하나의 열
- 차수: 한 릴레이션에 들어 있는 애트리뷰트들의 수
- 카디날리티: 릴레이션의 투플 수
- 릴레이션 스키마: 릴레이션의 구조를 정의한 틀
- 릴레이션 인스턴스: 정의된 스키마에 실제로 저장되는 투플들의 집합
- 도메인: 한 애트리뷰트에 나타날 수 있는 값들의 집합
- 널값: 데이터베이스에서 ‘값이 존재하지 않음’, ‘알려지지 않음’을 나타내기 위해 사용하는 값
릴레이션의 특성
- 한 애트리뷰트의 값은 모두 같은 도메인값을 가진다
- 애트리뷰트들은 서로 다른 이름을 가진다
- 한 릴레이션 내의 완전히 중복된 투플은 비허용한다
- 애트리뷰트는 단일값을 가진다
- 애트리뷰트의 순서는 중요하지 않다
- 투플의 순서는 중요하지 않다
릴레이션의 키
- 수퍼키: 투플을 고유하게 식별하는 하나 이상의 애트리뷰트들의 집합
- 후보키: 투플을 고유하게 식별할 수 있는 최소한의 애트리뷰트들의 집합
- 기본키: 여러 후보키 중 하나를 선정하여 대표로 삼는 키
- 대체키: 기본키로 선정되지 않은 후보키
- 대리키: 일련 번호와 같이 인위적으로 만든 기본키
- 복합키: 두 개 이상의 애트리뷰트로 이루어진 후보키
- 외래키: 어떤 릴레이션의 기본키를 참조하는 애트리뷰트
외래키의 유형
다른 릴레이션의 기본키를 참조하는 외래키
가장 일반적인 형식입니다. 헷갈릴 만한 부분은 외래키와 기본키의 애트리뷰트는 같은 도메인이어야 하지만 이름까지 반드시 같을 필요는 없다.
자체 릴레이션의 기본키를 참조하는 외래키
외래키는 외래키가 소속되어 있는 릴레이션의 기본키를 참조할수도 있습니다.
기본키의 구성 요소가 되는 외래키
추가적으로, 헷갈릴 만한 것은 대리키의 사용입니다.
그림의 모양만 보면 기본키의 구성 요소가 되는 외래키 같지만, “수강”릴레이션에 기본키가 따로 있으므로 다른 릴레이션의 기본키를 참조하는 외래키 유형입니다.
무결성 제약 조건
- 도메인 제약 조건: 릴레이션의 애트리뷰트가 해당 도메인에 지정된 값만 가져야 한다는 조건
- 개체 무결성 제약 조건 (기본키 제약): 릴레이션은 기본키를 가져야 하고 기본키는 고유하며 널값을 가질 수 없다는 조건
- 참조 무결성 제약 조건 (외래키 제약): 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 동일해야 하며, 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 기본키 값과 동일하거나 널값(외래키가 기본키를 구성하지 않는 경우만 해당)이어야 한다는 조건
개체 무결성 제약 조건에 의해 외래키에도 NULL 값이 불가능한 경우가 있습니다.