MySQL로 배우는 데이터베이스 개론과 실습 2판: Chapter 02 관계 데이터 모델
🔥학습목표
1. 관계 데이터 모델의 개념을 이해한다.
2. 관계 데이터 모델의 제약조건을 알아본다.
3. 관계 데이터 모델의 연산인 관계대수의 종류와 작성법을 알아본다.
PREVIEW
데이터베이스 시스템에서 가장 중요한 것은 데이터다. 데이터 간 관계 설정과 저장 방법에 관한 여러 이론이 제시되었는데, 이를 데이터 모델이라고 한다. 데이터 모델에는 네트워크 데이터 모델, 계층 데이터 모델, 관계 데이터 모델, 객체-관계 데이터 모델 등이 있다. 이 중에서 관계 데이터 모델을 가장 많이 사용한다.
관계 데이터 모델은 사용자들이 데이터에 접근하기 쉬운 테이블 형태로 데이터 간의 관계를 표현한다. 네트워크 데이터 모델과 계층 데이터 모델이 자료를 레코드 단위로 복잡하게 처리하였다면, 관계 데이터 모델은 집합 형태의 테이블 단위로 처리하여 쉽게 이해하고 접근할 수 있도록 하였다. 이 장에서는 DBMS의 핵심 모델로 이해하기 쉽고 많이 사용되는 관계 데이터 모델에 대해 알아본다.
01 관계 데이터 모델의 개념
1970년에 에드가 코드(E. F. Codd) 박사가 제안한 관계 데이터 모델은 수학의 집합이론에 근거하고 있어 다른 모델에 비해 이론적 토대가 단단하다. 또한 관계 데이터 모델이 적용된 SQL 언어는 비절차적인 언어로 원하는 데이터를 쉽게 표현한다는 장점이 있다. 대표적인 관계 데이터 모델 기반 DBMS로는 Oracle, SQL Server, DB2, MySQL, PostgreSQL과 모바일용인 SQLite 등이 있다. 관계 데이터 모델을 이해하기 위해 관련 용어를 먼저 살펴보자.
릴레이션의 개념
| 용어 | 한글 용어 |
| relation | 릴레이션, 테이블('관계'라고 하지 않음) |
| relational data model | 관계 데이터 모델 |
| relational database | 관계 데이터베이스 |
| relational algebra | 관계대수 |
| relationship | 관계 |
릴레이션 스키마와 인스턴스
릴레이션은 스키마와 인스턴스로 이루어진다. 스키마(schema)는 관계 데이터베이스의 릴레이션이 어떻게 구성되는지, 어떤 정보를 담고 있는지에 대한 기본적인 구조를 정의한다. 테이블에서 스키마는 테이블의 헤더(header)에 나타나며 각 데이터의 특징을 나타내는 속성, 자료 타입 등의 정보를 담고 있다. 인스턴스(instance)는 정의된 스키마에 따라 테이블에 실제로 저장되는 데이터의 집합을 의미한다.

릴레이션 스키마
릴레이션 스키마는 릴레이션에 어떤 정보가 담길지를 정의한다.
- 속성(attribute): 릴레이션 스키마의 열
- 도메인(domain): 속성이 가질 수 있는 값의 집합
- 차수(degree): 속성의 개수
릴레이션 스키마는 다음과 같이 표기할 수 있다. 관계 데이터베이스 스키마는 여러 릴레이션 스키마의 집합으로 구성된다.

릴레이션 인스턴스
릴레이션 인스턴스는 릴레이션 스키마에 실제로 저장된 데이터의 집합이다.
- 투플(tuple): 릴레이션의 행
- 카디날리티(cardinality): 투플의 수
릴레이션 구조와 관련된 용어
| 릴레이션 용어 | 같은 의미로 통용되는 용어 | 파일 시스템 용어 |
| 릴레이션(relation) | 테이블(table) | 파일(file) |
| 스키마(schema) | 내포(intension) | 헤더(header) |
| 인스턴스(instacne) | 외연(extension) | 데이터(data) |
| 투플(tuple) | 행(row) | 레코드(record) |
| 속성(attribute) | 열(column) | 필드(field) |
여기서 잠깐! 릴레이션과 테이블
릴레이션과 테이블은 같은 의미로 사용된다. 다만 릴레이션은 수학의 집합이론에 기초하기 때문에 속성이나 인스턴스의 중복을 허용하지 않는다. 릴레이션은 주로 구조를 강조하는 의미로 이론을 설명할 때 많이 사용되고, 테이블은 데이터를 강조하는 의미로 실무에서 많이 사용된다.
릴레이션의 특징
- 속성은 단일 값을 가진다: 각 속성의 도메인 값은 도메인에 정의된 값만 가지며 그 값은 모두 단일 값이어야 한다.
- 속성은 서로 다른 이름을 가진다: 속성은 한 릴레이션에서 서로 다른 이름을 가져야 한다.
- 한 속성의 값은 모두 같은 도메인 값을 가진다: 한 속성에 속한 열은 모두 그 속성에서 정의한 도메인 값만 가질 수 있다.
- 속성의 순서는 상관없다: 속성의 순서가 달라도 릴레이션 스키마는 같다.
- 릴레이션 내의 중복된 투플은 허용하지 않는다: 하나의 릴레이션 인스턴스 내에서는 서로 중복된 값을 가질 수 없다. 즉, 모든 투플은 서로 달라야 한다.
- 투플의 순서는 상관없다:투플의 순서가 달라도 같은 릴레이션이다. 관계 데이터 모델의 투플은 실제 값을 가지고 있으며 이 값은 시간이 지남에 따라 데이터의 삭제, 수정, 삽입에 따라 순서가 바뀔 수 있다.
관계 데이터 모델
관계 데이터 모델은 데이터를 2차원 테이블 형태인 릴레이션으로 표현하며, 릴레이션에 대한 제약조건(constraints)과 관계 연산을 위한 관계대수(relational algebra)를 정의한다.
관계 데이터 모델을 컴퓨터 시스템에 구현한 것을 관계 데이터베이스 시스템이라고 한다. 관계 데이터 베이스 시스템은 관계 데이터 모델에 기초하여 SQL을 기반으로 구현된다. [그림 2-5]와 같이 릴레이션 생성과 관리, 제약조건 표현, 데이터를 추출하는 연산 등을 모두 SQL로 표현해 수행한다.

02 무결성 제약조건
관계 데이터베이스에서 데이터의 사용 및 관계 표현에 가장 중요한 개념인 키를 먼저 공부한 다음 제약조건에 대해 살펴본다.
키
관계 데이터베이스에서 키(key)는 릴레이션에서 특정 투플을 식별할 때 사용하는 속성 혹은 속성의 집합이다. 릴레이션은 중복된 투플을 허용하지 않기 때문에 각각의 투플에 포함된 속성 중 어느 하나(혹은 하나 이상)는 값이 달라야 한다. 즉, 키가 되는 속성(혹은 속성의 집합)은 반드시 값이 달라서 투플들을 서로 구별할 수 있어야 한다.

슈퍼키
슈퍼키(super key)는 투플을 유일하게 식별할 수 있는 하나의 속성 혹은 속성의 집합을 말한다. (유일성 보장)
투플을 유일하게 식별할 수 있는 값이면 모두 슈퍼키가 될 수 있다. 고객 릴레이션의 경우 고객 번호와 주민번호를 포함한 모든 속성의 집합이 슈퍼키가 된다. 정의에 따라 고객 릴레이션의 슈퍼키를 나열하면 다음과 같다.

슈퍼키에는 투플을 식별할 수 없는 속성도 포함되어 있다. 키를 구성하는 속성이 많으면 그만큼 관계가 복잡하고 사용하기 불편하므로 투플을 식별할 수 있는 최소한의 속성 집합에 관심을 두어야 하는데 이것이 바로 뒤이어 살펴볼 후보키다.
후보키
후보키(candidate key)는 투플을 유일하게 식별할 수 있는 속성의 최소 집합이다. (유일성, 최소성 보장)
후보키는 '주민번호', '고객번호'만 될 수 있다. 예를 들어 (주민번호, 이름)은 슈퍼키이지만 후보키는 아니다. 식별과 상관없는 속성인 '이름'이 포함되어 있기 때문이다.
주문 릴레이션의 후보키는 두 개의 속성을 합한 (고객번호, 도서번호)가 된다. 이렇게 두 개 이상의 속성으로 이루어진 키를 복합키(composit key)라고 한다. 만약 1명의 고객이 동일한 도서를 구입할 수 있다고 가정하면 (고객번호, 도서번호)는 투플을 유일하게 식별할 수 없게 되어 후보키가 되지 못한다. 이 문제는 대리키에서 다시 다루기로 한다.
기본키
기본키(primary key, PK)는 여러 후보키 중 하나를 선정하여 대표로 삼는 키를 말한다. 후보키가 하나뿐이라면 그 후보키를 기본키로 사용하면 되고, 후보키가 여러 개라면 릴레이션의 특성을 반영하여 하나를 선택하면 된다. 기본키 선정 시 고려사항을 정리하면 다음과 같다.
- 릴레이션 내 투플을 식별할 수 있는 고유한 값을 가져야 한다.
- NULL 값은 허용하지 않는다.
- 키 값의 변동이 일어나지 않아야 한다.
- 최대한 적은 수의 속성을 가진 것이어야 한다.
- 향후 키를 사용하는 데 있어서 문제 발생 소지가 없어야 한다.
NULL은 '없다', '존재하지 않다'라는 의미로, 데이터 값이 입력되지 않으면 DBMS는 NULL을 특수한 값으로 저장한다. 이 값은 공백, 0 등과는 다르다.
대리키
기본키가 보안을 필요로 하거나, 여러 개의 속성으로 구성되어 복잡하거나, 마땅한 기본키가 없을 때는 일련번호 같은 가상의 속성을 만들어 기본키로 삼는 경우가 있다. 이러한 키를 대리키(surrogate key) 혹은 인조키(artificial key)라고 한다. 대리키는 DBMS나 관련 소프트웨어에서 임의로 생성하는 값으로, 사용자가 직관적으로 그 값의 의미를 알 수 없다.
매번 기본키로 (고객번호, 도서번호)를 사용하면 복잡하고 불편하다. 이 경우 사용자에게 의미는 없지만 주문 릴레이션에 '주문번호'라는 새로운 속성을 만들면 불편을 해소할 수 있다. 이와 더불어 주문번호 속성을 이용하면 한 명의 고객이 같은 도서를 구입할 수 있어 주문 테이블의 기능이 향상된다.
대체키
대체키(alternate key)는 기본키로 선정되지 않은 후보키를 말한다. 고객 릴레이션의 경우 고객번호와 주민번호 중 고객번호를 기본키로 정하면 주민번호가 대체키가 된다.
외래키
외래키(foreign key, FK)는 다른 릴레이션의 기본키를 참조하는 속성을 말한다. 지금까지 살펴본 키들이 단일 릴레이션 내에서 정해진다면 외래키는 다른 릴레이션의 기본키를 참조하여 관계 데이터 모델의 특징인 릴레이션 간의 관계(relationship)를 표현한다.

외래키가 성립하기 위해서는 참조하고(refer) 참조되는(referred) 양쪽 릴레이션의 도메인이 서로 같아야 한다. 또한 참조되는 릴레이션의 기본키 값이 변경되면 이 기본키를 참좋나느 외래키 값 역시 변경되어야 한다. 즉, 참조하는 외래키 값이 참조되는 기본키 값에 연동되어 항상 데이터의 일관성이 유지된다. 이러한 특징을 외래키 제약조건이라고 하며 자세한 내용은 다음 절에서 다시 언급한다.
외래키(참조하는 키)는 참조되는 릴레이션의 기본키와 달리 NULL 값을 포함할 수 있고 중복값도 허용한다. [그림 2-9]의 주문 릴레이션을 보면 고객번호 1이 세 번 중복된 것을 확인 할 수 있다.
외래키 사용 시 참조하는 릴레이션과 참조되는 릴레이션이 꼭 다른 릴레이션일 필요는 없다. 즉, 자기 자신의 기본키를 참조할 수도 있다. [그림 2-10]을 보자. 멘토 릴레이션의 각 선수에게는 멘토가 있으며, 멘토는 멘토번호 속성에 있는 선수 번호를 통해 알 수 있다. 김연아의 멘토는 김연경(선수 번호3)이고, 김연경의 멘토는 추신수(선수 번호 4)다. 박지성과 추신수에게는 멘토가 없어 '값이 없음'의 의미로 NULL 값이 저장되어 있다.

외래키의 특징을 정리하면 다음과 같다.
- 관계 데이터 모델에서 릴레이션 간의 관계를 표현한다.
- 다른 릴레이션의 기본키를 참조하는 속성이다.
- 참조하고(외래키) 참조되는(기본키) 양쪽 릴레이션의 도메인은 서로 같아야 한다.
- 참조되는(기본키) 값이 변경되면 참조하는(외래키) 값도 변경된다.
- NULL 값과 중복값 등이 허용된다.
- 자기 자신의 기본키를 참조하는 외래키도 가능하다.
- 외래키는 기본키의 일부가 될 수 있다.

무결성 제약조건
데이터 무결성(integrity)은 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것을 말한다.
무결성 제약조건에는 투플에 삽입할 수 있는 데이터의 값을 제한하는 도메인 무결성 제약조건과 관계 데이터 모델의 핵심인 관계 표현을 위한 개체 무결성 제약조건, 참조 무결성 제약조건이 있다.
도메인 무결성 제약조건
도메인 무결성 제약조건(domain integrity constraint)은 도메인 제약(domain constraint)이라고도 하며, 릴레이션 내의 투플들이 각 속성의 도메인에 지정된 값만 가져야 한다는 조건이다. 도메인 무결성 제약조건은 속성값과 관련된 무결성으로, SQL 문에서 데이터 형식(type), 널(nul/not null), 기본값(default), 체크(check) 등을 사용하여 지정할 수 있다.
개체 무결성 제약조건
개체 무결성 제약조건(entity integrity constraint)은 기본키 제약(primary key constraint)이라고도 한다. 릴레이션은 기본키를 지정하고 그에 따른 무결성 원칙(기본키는 NULL 값을 가져서는 안 되며 릴레이션 내에 오직 하나의 값만 존재해야 한다)을 지켜야 한다는 조건이다. 개체 무결성 제약조건은 참조 무결성 제약조건과 함께 관계 데이터 모델의 핵심 개념이다.
참조 무결성 제약조건
참조 무결성 제약조건(referential integrity constraint)은 외래키 제약(foreign key constraint)이라고도 한다. 릴레이션 간의 참조 관계를 선언하는 제약조건이다. 일반적으로 참조되는(제공하는) 릴레이션을 부모(parent) 릴레이션, 참조하는(제공받는) 릴레이션을 자식(child) 릴레이션이라고 한다. 참조 무결성 제약조건이란 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 같아야 하며, 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받는다는 것이다. 즉 부모 릴레이션의 도메인과 다른 값으로 삽입 · 수정되거나, 반대로 자식 릴레이션에서 참조하는 값을 부모 릴레이션에서 삭제하거나 다른 값으로 변경할 경우 거부된다.
[표2-3]은 각 무결성 제약조건을 정리한 내용이다.

무결성 제약조건의 수행
개체 무결성 제약조건
관계 데이터베이스 시스템에서 DBMS는 투플을 삽입하거나 수정할 때마다 개체 무결성 제약조건을 지키는지 확인한다. 즉 기본키 값이 유일한지, NULL 값이 아닌지를 검사하낟. 만약 조건에 맞지 않으면 삽입 연산을 거부하고 오류 메시지를 보낸다.

삽입
학생 투플 (501, 남슬찬, 1001)이 삽입되는 과정을 나타낸 것이다. 기본키인 학번에 이미 '501'이 존재하는 것을 발견하고 삽입을 거부한다. 또 다른 투플 (NULL, 남슬찬, 1001)의 삽입 역시 기본키가 NULL이기 때문에 기존 투플을 검색할 필요도 없이 거부한다.
수정
수정 연산 역시 삽입 연산과 동일한 제약에 따라 처리된다. 학생 릴레이션의 학번 '501'을 '502'로 수정한다면 DBMS는 동일한 값이 존재하는지 검색한 후 수정을 거부한다.
삭제
특별한 확인이 필요하지 않으며 즉시 수행한다. 단, 참조 무결성 제약조건에 의하여 학생 릴레이션의 기본키를 다른 릴레이션에서 참조하고 있으면 바로 삭제하지 않는다.
참조 무결성 제약조건
참조 무결성 제약조건은 개체 무결성 제약조건과 달리 단일 릴레이션에 관한 내용이 아니다. [그림 2-14] 학생관리 데이터베이스의 예로, 부모 릴레이션(기본키가 참조되는 릴레이션)과 자식 릴레이션(기본키를 참조하는 릴레이션)의 관계를 보여준다. 학과 릴레이션이 부모 릴레이션이고, 학생 릴레이션이 자식 릴레이션이다.

삽입(자식 릴레이션에서)
학생 릴레이션에 새롱누 투플 (601, 박세리, 3001)이 삽입되는 과정을 살펴보자. DBMS는 먼저 도메인 무결성 제약조건을 확인한 후 개체 묵려성 제약조건에 위배되는 값이 없는지 확인한다. '3001'은 학과 릴레이션에 없으므로 삽입이 거부된다. 참고로, 학생 릴레이션 생성 시 외래키인 학과코드 속성에 NULL 값을 허용하였다면 학과코드 값이 없어도 삽입할 수 있다. 부모 릴레이션에서 삽입은 객체 무결성 제약조건에 따르면 된다.
삭제(부모 릴레이션에서)
삽입과는 반대로 자식 릴레이션에서 투플이 삭제되는 경우 부모 릴레이션에는 아무런 영향을 주지 않으므로 바로 삭제할 수 있다. 그러나 부모 릴레이션에서 투플이 삭제되는 경우에는 문제가 발생할 수 있다.
부모 릴레이션에서 투플을 삭제할 경우 참조 무결성 조건을 수행하기 위한 고려사항
- 즉시 작업을 중지
- 자식 릴레이션의 관련 투플을 삭제
- 초기에 설정된 다른 어떤 값으로 변경
- NULL 값으로 설정


수정(부모 릴레이션에서)
수정은 삭제와 삽입 명령이 연속해서 수행된다고 보면 된다. 부모 릴레이션의 수정이 일어날 때 삭제 옵션에 따라 처리된 후 문제가 없으면 다시 삽입 제약조건에 따라 처리된다. 학과 릴레이션의 학과코드 '1001'을 'A001'로 수정할 경우, 삭제 옵션에 따라(옵션이 RESTRICTED인 경우에는 작업 중지) 자식 릴레이션의 관련된 투플을 처리한 후, 삽입 제약조건에 따라 학과 릴레이션에 삽입한다.
03 관계대수
코드 박사는 관계대수(relational algebra)와 관계해석(relational calculus)을 관계 데이터 모델을 사용하는 데 필요한 언어로 소개하였다. 관계대수는 어떤 데이터를 어떻게 찾는지에 대한 처리 절차를 명시하는 절차적인 언어이며, DBMS 내부의 처리 언어로 사용된다. 관계해석은 어떤 데이터를 찾는지만 명시하는 선언적인 언어로, 관계대수와 함께 관계 DBMS의 표준 언어인 SQL의 이론적 기반을 제공한다. 관계대수와 관계해석은 모두 관계 데이터 모델의 중요한 언어이며 실제로 동일한 표현 기능이 있다.
관계대수
관계대수(relational algebra)란 릴레이션에서 원하는 결과를 얻기 위해 대수학의 대수와 같은 연산을 이용하여 질의하는 방법을 기술하는 언어이다.