01. 관계 데이터 모델의 개념
관계 데이터 모델은 수학의 집합이론에 근거하고 있어 다른 모델에 비해 이론적 토대가 탄탄함
관계 데이터 모델이 적용된 SQL 언어는 비절차적인 언어로 원하는 데이터를 쉽게 표현한다는 장점
대표적인 관계 데이터 모델 기반 DBMS : Oracle, SQL Server, DB2, MySQL, PostgreSQL과 모바일용인 SQLite 등
(1) 릴레이션의 개념
릴레이션(relation) : 행과 열로 구성된 테이블
ㄴ 수학의 집합이론에서 나온 개념
| 도서번호 | 도서이름 | 출판사 | 가격 |
| 1 | 축구의 역사 | 굿스포츠 | 7000 |
| 2 | 축구 아는 남자 | 나무수 | 13000 |
| 3 | 축구의 이해 | 대한미디어 | 22000 |
| 4 | 골프 바이블 | 대한미디어 | 35000 |
| 5 | 피겨 교본 | 굿스포츠 | 8000 |
^ 도서 테이블(릴레이션)
위의 도서 릴레이션의 경우, 각 도서는 네 개의 집합인 도서번호, 도서이름, 출판사, 가격의 원소값으로 구성
테이블에서 첫 번째 행의 (1, 축구의 역사, 굿스포츠, 7000)은 네 개의 집합에서 각각 원소를 한 개씩 선택하여 만들어진 것
== 원소들이 관계(relationship)를 맺고 있음
ㄴ 도서 릴레이션은 이러한 관계 다섯 개가 모여 생성된 것
관계를 맺는 방법은 집합연산인 카티션 프로덕트(연산자 기호 ×) 연산을 사용
관계의 종류
- 릴레이션(테이블) 내의 관계
- 릴레이션 안에 있는 데이터들의 집합으로 표현
- 하나의 테이블 안에서 한 행(row)이 갖는 데이터들 사이의 연관성
- 릴레이션(테이블) 간의 관계
- 릴레이션을 식별 가능한 값을 이용해 표현
- 서로 다른 두 테이블이 어떤 연관이 있는지를 나타냄
(2) 릴레이션 스키마와 인스턴스
릴레이션은 스키마와 인스턴스로 구성
- 스키마(schema)
- 관계 데이터베이스의 릴레이션이 어떻게 구성되는지, 어떤 정보를 담고 있는지에 대한 기본적인 구조를 정의
- 테이블에서 헤더에 나타나며, 각 데이터의 특징을 나타내는 속성, 자료 타입 등의 정보를 담고 있음
- 인스턴스(instance)
- 정의된 스키마에 따라 테이블에 실제로 저장되는 데이터의 집합을 의미
✔️ 릴레이션 스키마
릴레이션 스키마 : 릴레이션에 어떤 정보가 담길지를 정의
- 속성(attribute) : 릴레이션 스키마의 열
- 도메인(domain) : 속성이 가질 수 있는 값의 집합
- 차수(degree) : 속성의 개수
위의 도서 릴레이션의 경우 차수는 4,
첫 번째 속성인 도서 번호의 도메인은 1보다 큰 정수의 집합,
두 번째 속성인 도서 이름의 도메인은 문자 집합
릴레이션 스키마는 '릴레이션 이름(속성 1, 속성 2, 속성 3, ...)'과 같이 표기
or 속성과 도메인을 같이 써서 '릴레이션 이름(속성 1: 도메인 1, 속성 2: 도메인 2, 속성 3: 도메인 3)'과 같이 표기
도서(도서번호, 도서이름, 출판사, 가격) 혹은
도서(도서번호: integer, 도서이름: char(40), 출판사: char(40), 가격: integer)
✔️ 릴레이션 인스턴스
릴레이션 인스턴스 : 릴레이션 스키마에 실제로 저장된 데이터의 집합
- 투플(tuple) : 릴레이션의 행
- 각 투플의 속성값은 릴레이션 스키마에서 정의한 도메인 값으로 구성
- 투플이 가지는 속성의 개수는 릴레이션 스키마의 차수와 동일
- 릴레이션 내의 모든 투플은 서로 중복되지 않아야 함
- 카디날리티(cardinality) : 투플의 총 개수
- 카디날리티는 투플의 삽입, 삭제, 수정 등에 따라 수시로 변함
(3) 릴레이션의 특징
- 속성은 단일 값을 가진다
- 각 속성의 값은 도메인에 정의된 값만 가지며, 그 값은 모두 단일 값이어야 함
- 속성은 서로 다른 이름을 가진다
- 속성은 한 릴레이션에서 서로 다른 이름을 가져야 함
- 한 속성의 값은 모두 같은 도메인 값을 가진다
- 한 속성에 속한 열은 모두 그 속성에서 정의한 도메인 값만 가질 수 있음
- 속성의 순서는 상관없다
- 속성의 순서가 달라도 같은 릴레이션 스키마
- ex) (이름, 주소) == (주소, 이름)
- 릴레이션 내의 중복된 투플은 허용하지 않는다
- 하나의 릴레이션 인스턴스 내에서는 서로 중복된 값을 가질 수 없음
- 모든 투플은 서로 값이 달라야 함
- 투플의 순서는 상관없다
- 투플의 순서가 달라도 같은 릴레이션
(4) 관계 데이터 모델
관계 데이터 모델은 데이터를 2차원 테이블 형태인 릴레이션으로 표현
제약조건 : 각 릴레이션에 정의된 데이터 값이 가져야 하는 제약을 의미
ex) 나이는 음수가 되면 안 됨 / 주문 릴레이션의 고객번호는 고객 릴레이션에서만 참조해야 함
관계 연산 : 릴레이션을 다루는 연산 규칙
ex) '주문' 릴레이션과 '고객' 릴레이션 등을 조작하여 특정 고객의 주문 내역을 검색하는 행위
관계 데이터 모델을 컴퓨터 시스템에 구현한 것을 관계 데이터베이스 시스템이라고 함
ㄴ 관계 데이터베이스 시스템은 관계 데이터 모델에 기초하여 SQL을 기반으로 구현됨
02. 무결성 제약조건
데이터베이스에 저장된 데이터는 결함이 없어야 하며 질의에 대해 신뢰성 있는 답을 제공해야 함
데이터베이스는 데이터 저장 시 일관성을 유지하고 중복을 제거하여 데이터의 신뢰도를 유지해야 함
(1) 키
키(key) : 릴레이션에서 특정 투플을 식별할 때 사용하는 속성 혹은 속성의 집합
ㄴ 키가 되는 속성은 반드시 값이 달라서 투플들을 서로 구별할 수 있어야 함
* 키는 각 릴레이션의 투플을 유일하게 식별하는 장치이자 릴레이션 간의 관계를 말해주는 연결고리
✔️ 슈퍼키
슈퍼키(super key) : 투플을 유일하게 식별할 수 있는 하나의 속성 혹은 속성의 집합
ㄴ 투플을 유일하게 식별할 수 있는 값이면 모두 슈퍼키가 될 수 있음
고객 릴레이션의 경우 고객번호와 주민번호를 포함한 모든 속성의 집합이 슈퍼키가 됨
(주민번호), (주민번호, 이름), (주민번호, 이름, 주소), (주민번호, 이름, 핸드폰), (고객 번호), ...
✔️ 후보키
후보키(cardidate key) : 투플을 유일하게 식별할 수 있는 속성의 최소 집합
고객 릴레이션의 경우 슈퍼키는 많지만, 후보키는 '주민번호', '고객번호'만 가능
복합키 : 두 개 이상의 속성으로 이루어진 키
✔️ 기본키
기본키(primary key, PK) : 여러 후보키 중 하나를 선정하여 대표로 삼는 키
ㄴ 후보키가 하나라면 그 후보키를 기본키로 사용하면 되고, 여러 개라면 릴레이션의 특성을 반영하여 하나를 선택하면 됨
기본키 선정 시 고려사항
- 릴레이션 내 투플을 식별할 수 있는 고유한 값을 가져야 한다
- NULL 값은 허용하지 않는다
- 키 값의 변동이 일어나지 않아야 한다
- 최대한 적은 수의 속성을 가진 것이어야 한다
- 향후 키를 사용하는 데 있어서 문제 발생 소지가 없어야 한다
릴레이션 스키마를 표현할 때 기본키는 밑줄을 그어 표시
릴레이션 이름(속성 1, 속성 2, ..., 속성 N)
✔️ 대리키
대리키(surrogate key) 혹은 인조키(artificial key) : 기본키가 보안을 필요로 하거나, 여러 개의 속성으로 구성되어 복잡하거나, 마땅한 기본키가 없을 때 일련번호 같은 가상의 속성을 만들어 삼는 기본키
ㄴ DBMS나 관련 소프트웨어에서 임의로 생성하는 값으로, 사용자가 직관적으로 그 값의 의미를 알 수 없음
✔️ 대체키
대체키(alternate key) : 기본키로 선정되지 않은 후보키
✔️ 외래키
외래키(foreign key, FK) : 다른 릴레이션의 기본키를 참조하는 속성
ㄴ 릴레이션 간의 관계를 표현
외래키가 성립하기 위해서는 참조하고 참조되는 양쪽 릴레이션의 도메인이 서로 같아야 함
외래키(참조하는 키)는 참조되는 릴레이션의 기본키와 달리 NULL 값을 포함할 수 있고 중복값도 허용
외래키 사용 시 자기 자신의 기본키를 참조할 수도 있음
외래키의 특징
- 관계 데이터 모델에서 릴레이션 간의 관계를 표현
- 다른 릴레이션의 기본키를 참조하는 속성
- 참조하고(외래키) 참조되는(기본키) 양쪽 릴레이션의 도메인은 서로 같아야 함
- 참조되는(기본키) 값이 변경되면 참조하는(외래키) 값도 변경됨
- NULL 값과 중복값 등이 허용
- 자기 자신의 기본키를 참조하는 외래키도 가능
- 외래키는 기본키의 일부가 될 수 있음
(2) 무결성 제약조건
데이터 무결성(integrity) : 데이터베이스에 저장된 데이터의 일관성과 정확성을 지키는 것
무결성 제약조건
- 도메인 무결성 제약조건
- 도메인 제약이라고도 함
- 릴레이션 내의 투플들이 각 속성의 도메인에 지정된 값만 가져야 한다는 조건
- 개체 무결성 제약조건
- 기본키 제약이라고도 함
- 릴레이션은 기본키를 지정하고 그에 따른 무결성 원칙을 지켜야 한다는 조건
- ㄴ 기본키는 NULL 값을 가져서는 안 되며, 릴레이션 내에 오직 하나의 값만 존재해야 함
- 참조 무결성 제약조건
- 외래키 제약이라고도 함
- 릴레이션 간의 참조 관계를 선언하는 제약조건
- 참조되는(제공하는) 릴레이션 : 부모 릴레이션 / 참조하는(제공받는) 릴레이션 : 자식 릴레이션
- 자식 릴레이션의 외래키는 부모 릴레이션의 기본키와 도메인이 같아야 함
- 자식 릴레이션의 값이 변경될 때 부모 릴레이션의 제약을 받음
(3) 무결성 제약조건의 수행
제약조건의 준수 여부는 데이터의 변경(삽입, 수정, 삭제)이 있을 때마다 확인해야 함
✔️ 개체 무결성 제약조건
관계 데이터베이스 시스템에서 DBMS는 투플을 삽입하거나 수정할 때마다 개체 무결성 제약조건을 지키는지 확인
== 기본키 값이 유일한지, NULL 값이 아닌지를 검사
ㄴ 만약 조건에 맞지 않으면 삽입 연산을 거부하고 오류 메시지를 보냄
- 삽입
- 릴레이션에 이미 존재하는 기본키의 값을 가진 투플 --> 삽입 거절
- 기본키가 NULL 값을 가진 투플 --> 삽입 거절
- 수정
- 릴레이션에 이미 존재하는 기본키의 값으로 수정 시도 --> 수정 거절
- 삭제
- 특별한 확인이 필요하지 않으며 즉시 수행함
- 단, 참조 무결성 제약조건에 의해 해당 릴레이션의 기본키를 다른 릴레이션에서 외래키로 참조하고 있으면 바로 삭제하지 않음
✔️ 참조 무결성 제약조건
- 삽입(자식 릴레이션에서)
- DBMS는 먼저 도메인 무결성 제약조건을 확인한 후 개체 무결성 제약조건에 위배되는 값이 없는지 확인
- 참조하고 있는 값이 부모 릴레이션에 있는지 확인 --> 없다면 삽입 거절 / 있다면 삽입 승인
- 삭제(부모 릴레이션에서)
- 자식 릴레이션에서 투플이 삭제되는 경우 부모 릴레이션에는 아무런 영향을 주지 않으므로 바로 삭제 가능
- 부모 릴레이션에서 투플이 삭제되는 경우 해당 투플의 기본키가 참조되고 있는지 확인 --> 없다면 삭제 승인 / 있다면 삭제 거절
03. 관계대수
관계대수 : 어떤 데이터를 어떻게 찾는지에 대한 처리 절차를 명시하는 절차적인 언어
관계해석 : 어떤 데이터를 찾는지만 명시하는 선언적인 언어
(1) 관계대수
관계대수(relational algebra) : 릴레이션에서 원하는 결과를 얻기 위해 대수학의 대수와 같은 연산을 이용하여 질의하는 방법을 기술하는 언어
ㄴ 절차적인 언어 --> 하나 이상의 릴레이션에 연산을 수행하여 결과 릴레이션이 나오기까지의 절차를 확인하는 방법을 제공
✔️ 릴레이션의 수학적 의미
집합 : 숫자, 사람, 문자 등 객체의 모임
두 개의 집합 A={2, 4}, B={1, 3, 5}가 있는 경우
- 두 집합의 카티션 프로덕트 A×B는 A 원소와 B 원소의 순서쌍 집합
- --> A×B={(2, 1), (2, 3), (2, 5), (4, 1), (4, 3), (4, 5)}
- 릴레이션 R은 카티션 프로덕트의 부분집합
- --> R1={(2, 1), (4, 1)}
- --> R2={(2, 1), (2, 3), (2, 5)}
- => 카티션 프로덕트 A×B의 부분집합의 개수는 2^(|A|×|B|)
카티션 프로덕트의 기초 집합 A, B, C 각각이 가질 수 있는 값의 범위를 도메인이라고 함
✔️ 관계대수 연산자
관계대수 연산자 역시 릴레이션 연산에 사용되는 기호 --> 피연산자 : 릴레이션
- 순수 관계 연산자
- 관계 데이터 모델을 위해 고안된 연산자
- 셀렉션, 프로젝션, 조인, 디비전, 개명
- 일반 집합 연산자
- 수학의 집합이론에서 차용된 연산자
- 합집합, 교집합, 차집합, 카티션 프로덕트
✔️ 관계대수식
관계대수 : 릴레이션 간 연산을 통해 결과 릴레이션을 찾는 절차를 기술한 언어
관계대수식 : 관계대수 연산을 수행하기 위한 식
- 단항 연산자 : 연산자<조건> 릴레이션
- 이항 연산자 : 릴레이션 1 연산자<조건> 릴레이션 2
관계대수식의 결과는 릴레이션으로 반환됨
반환된 릴레이션은 릴레이션의 모든 특징을 따름
== 중복된 투플은 존재하지 X
(2) 셀렉션과 프로젝션
✔️ 셀렉션
셀렉션(selection) : 릴레이션에서 조건에 부합하는 투플을 추출하기 위한 연산
하나의 릴레이션을 대상으로 하는 단항 연산자
결과 릴레이션의 차수는 대상 릴레이션과 동일하고 카디날리티는 대상 릴레이션보다 작거나 같음
σ<조건> (R)
여러 개의 조건을 지정해야 한다면, ∧(and), ∨(or), ¬(not) 기호를 이용하여 표현
✔️ 프로젝션
프로젝션(projection) : 릴레이션에서 조건에 부합하는 속성을 추출하기 위한 연산
하나의 릴레이션을 대상으로 하는 단항 연산자
결과 릴레이션의 차수는 대상 릴레이션의 차수보다 작거나 같고 카디날리티는 동일함
∏<속성리스트> (R)
(3) 집합연산
합병가능 : 두 릴레이션의 속성 수가 같고, 순서도 같아야 하며 각각 동일한 도메인으로 대응되어야 한다는 조건
ㄴ 속성 이름은 동일하지 않아도 되며, 반환되는 릴레이션의 속성 이름은 첫 번째 릴레이션의 이름과 같음
✔️ 합집합
합집합(union) : 두 개의 릴레이션을 합하여 하나의 릴레이션을 반환
두 개의 릴레이션은 서로 같은 속성 순서와 도메인을 가져야 함
반환되는 결과는 첫 번째 릴레이션의 속성 이름을 가짐
R ∪ S
✔️ 교집합
교집합(intersection) : 두 릴레이션이 공통으로 가지고 있는 투플을 반환
두 개의 릴레이션은 합병가능해야 함
R ∩ S
✔️ 차집합
차집합(difference) : 첫 번째 릴레이션에는 속하고 두 번째 릴레이션에는 속하지 않는 투플을 반환
두 개의 릴레이션은 합병가능해야 함
R ― S
✔️ 카티션 프로덕트
카티션 프로덕트(cartesian product) : 두 릴레이션을 연결시켜 합친 하나의 릴레이션을 반환
ㄴ 결과 릴레이션은 첫 번째 릴레이션의 오른쪽에 두 번째 릴레이션의 모든 투플을 순서대로 배열하여 반환
속성과 도메인이 같을 필요는 없음
결과 릴레이션의 차수는 두 릴레이션의 차수의 합, 카디날리티는 두 릴레이션의 카디날리티의 곱
* 두 릴레이션이 동일한 속성 이름을 가지고 있으면 충돌할 가능성 O
--> 결과 릴레이션의 속성 이름을 '<릴레이션 이름>.<속성 이름>'의 형태로 표현하거나 순서(위치)를 사용하여 표현
R × S
(4) 조인
조인(join) : 두 릴레이션의 공통 속성을 기준으로 속성값이 같은 투플을 수평으로 결합하는 연산
ㄴ 두 릴레이션에 카티션 프로덕트 연산을 한 후 셀렉션 연산을 한 것으로 정의할 수 있음
- 기본 조인 연산
- 세타조인
- 동등조인
- 자연조인
- 확장된 조인 연산
- 세미조인
- 외부조인
✔️ 세타조인과 동등조인
세타조인(theta join, θ) : 조인에 참여하는 두 릴레이션의 속성값을 비교하여 조건을 만족하는 투플만 반환
R ⋈(r 조건 s) S
동등조인(equal join) or 내부조인(inner join) : 세타조인에서 = 연산자를 사용한 조인을 의미
* 보통 조인 연산이라고 하면 동등조인을 지칭
R ⋈(r=s) S
✔️ 자연조인
자연조인(natural join) : 동등조인에서 조인에 참여한 속성이 두 번 나오지 않도록 중복 속성을 제거한 결과를 반환
R ⋈N(r, s) S
✔️ 외부조인과 세미조인
외부조인(outer join) : 자연조인 시 조인에 실패한 투플을 모두 보여주되, 값이 없는 대응 속성에는 NULL 값을 채워서 반환
모든 속성을 보여주는 기준 릴레이션 위치에 따라 왼쪽, 오른쪽, 완전 외부조인으로 나뉨
- 왼쪽 외부조인 : R ⟕(r, s) S
- 오른쪽 외부조인 : R ⟖(r, s) S
- 완전 외부조인 : R ⟗(r, s) S
세미조인(semi join) : 자연조인을 한 후 두 릴레이션 중 한쪽 릴레이션의 결과만 반환
기호에서 닫힌 쪽 릴레이션의 투플만 반환
- R ⋉(r, s) S
- R ⋊(r, s) S
(5) 디비전
디비전(division) : 릴레이션 속성값의 집합으로 연산을 수행
R ÷ S
^ S의 속성값을 가지는 모든 R 튜플을 추출
| A | B |
| s1 | b1 |
| s2 | b2 |
| s3 | b1 |
| s4 | b4 |
^ R
| B |
| b1 |
^ S1
R ÷ S1 -->
| A |
| s1 |
| s3 |
'DB > MySQL로 배우는 데이터베이스 개론과 실습' 카테고리의 다른 글
| Chapter 01. 데이터베이스 시스템 (0) | 2026.04.14 |
|---|