관계 데이터 모델
- 관계 데이타 모델의 특성
- 수학에서의 집합(set)과 릴레이션(relation) 이론에 기초
- 일반 사용자 입장에서는 테이블(table) 형태로 생각
- 모든 데이터를 테이블 형태로 저장 및 관리
- 테이블의 열(column) = 필드(field)
- 테이블의 행(row) = 레코드(record) ≒ 관계 데이타 모델의 투플(tuple)
≒ 관계 데이타 모델의 애트리뷰트(attribute)
애트리뷰트와 도메인
- 테이블(table) ≒ 릴레이션(relation)
- 애트리뷰트(attribute)
- 릴레이션의 속성
- 한 릴레이션 내에서 애트리뷰트 이름들은 모두 달라야 함
- 도메인의 역할(role) 이름
- 도메인(domain)
- 각 애트리뷰트가 취할 수 있는 값(value)들의 집합
- 각 애트리뷰트의 타입에 이름을 부여한 것임
- 모든 DBMS가 도메인을 명시적으로 지원하지는 않음.
- PostgreSQL, Informix 등
릴레이션의 개념
- STUDENT 릴레이션의 정의
create domain DSNO INTEGER; create domain NAME CHAR(10); create domain DYEAR INTEGER; create domain DEPT CHAR(6); create table STUDENT (Sno DSNO, Sname NAME, Year DYEAR, Dept DEPT);
- 도메인 명세가 생략된 STUDENT 릴레이션 정의
Create Table STUDENT (Sno INTEGER, Sname VARCHAR(30), Year INTEGER, Dept CHAR(6));
STUDENT 릴레이션 예
릴레이션 스키마 (relation schema)
- 릴레이션 스키마 = 애트리뷰트의 집합( a set of attributes )
- R(A1, A2, ... , An), Ai ⇔ Di
- R({A1, A2, ... , An})
- 릴레이션 내포 (relation intension), 릴레이션 스킴 (relation scheme) 이라고도 함.
- 정적인성질
- 시간에 무관
- 시간에 따라 변경되지 않음
릴레이션 인스턴스 (relation instance)
- 릴레이션 R의 인스턴스
- 어느 한 시점에 릴레이션 R이 포함하고 있는 투플들의 집합(a set of tuples)
- {<V1,V2,...,Vn>|Vi ∈Di }
- 릴레이션의 내용, 상태, snapshot
- 투플: <attr1=V1, attr2=V2, ··· , attrn=Vn>
- 릴레이션 외연 (relation extension)이라고도 함
- 동적성질
- 삽입, 삭제, 갱신으로 시간에 따라 변함
- 릴레이션 값(보통 릴레이션)
릴레이션(Relation) R
- 개념적 정의:
- 릴레이션 스키마 + 릴레이션 인스턴스 수
- 수학적 정의:
- 릴레이션 R의 애트리뷰트 도메인들의 카티션 프로덕트(곱집합, Cartesian product)의 부분집합
- R⊆D1 ×D2 ×...×Dn,단Di : i번째애트리뷰트의도메인
- 즉 n-투플, <d1, d2, ... , dn>의 집합
- di ∈Di, i=1,2,...,n
차수와 카디날리티
- 릴레이션의 차수(degree): 릴레이션의 애트리뷰트 갯수
- 릴레이션의 카디날리티(cardinality): 릴레이션의 투플
- 두개의 릴레이션을 곱집합할 때
- 차수는 양쪽 릴레이션 차수의 합
- 카디날리티는 양쪽 릴레이션 카디날리티의 곱
릴레이션의 특성 - 테이블과의 차이점
1) 투플의 유일성 (uniqueness of tuples)
릴레이션 = 투플들의 "집합(set)"
2) 투플의 무순서성 (no ordering of tuples)
릴레이션 : 추상적 개념 = 투플들의 집합(set)
테이블 : 구체적 개념
3) 애트리뷰트의 무순서성 (no ordering of attributes)
릴레이션 스키마 → 애트리뷰트들의 "집합"
투플 : <attribute: value>쌍의 집합
4) 애트리뷰트의 원자성(atomicity)
- 애트리뷰트 값은 단일값을 가져야 함. 복수의 값을 가지면 안됨
- 정규화 릴레이션 (normalized relation)
- 애트리뷰트 값으로 원자값만 허용되는 릴레이션
- 비정규화 릴레이션은 분해(decomposition)를 통해 정규화
- 널 값(null value)도 원자 값으로 취급
- unknown,inapplicable
개체간의 카디날리티 관계 유형
- 1:1 관계
- 예) 개인: 면허증, 자동차: 자동차 등록증, 국가: 수도
- 1:N 관계
- 예) 부모: 자녀, 강좌: 강의, 회사: 직원, 유튜버: 유튜브 동영상
- M:N 관계
- 예) 학생 : 과목, 배우: 영화, 상품: 주문, 프로젝트: 팀원
관계 데이터베이스 개념
- 관계 데이타베이스(relational database)
- 테이블들의 집합
- 데이타베이스를 시간에 따라 그 내용(상태)이 변할 수 있는 테이블 형태로 표현
- 관계 데이타베이스 스키마(relational database schema)
= {릴레이션 스키마} + {무결성 제약조건}
- 관계데이타모델 ⇔ 프로그래밍시스템과의비교
- 릴레이션 ⇔ 화일
- 투플 ⇔ 레코드
- 애트리뷰트 ⇔ 필드
관계 데이터베이스는 집합 이론에 기초
- database: a set of relations
- relation instance: a set of tuples
- relation schema: a set of attributes
릴레이션의 키(key)
- 키(key)
- 릴레이션 안에서 각 투플을 유일하게 식별할 수 있는 애트리뷰트 집합(set of attributes)
- 후보 키(candidate key)
- 릴레이션 R(A1, A2, ..., An)에 대한 애트리뷰트 부분집합, K({Ai,Aj ,...,Ak})이 다음 두 성질을 만족
- 유일성(uniqueness)
- 각 투플에 대해 K({Ai , Aj , ... , Ak})의 값(< vi , vj , ... , vk >) 은 유일
- 최소성(minimality)
- K는 각 투플을 유일하게 식별하는데 필요한 애트리뷰트만 포함
- 슈퍼 키(super key)
- 유일성(uniqueness)은 만족하지만 최소성(minimality)은 만족하지 않는 애트리뷰트의 집합
- 기본 키(primary key)
- 후보 키(candidate key) 중에서 지정된 하나의 키
- 데이타베이스 설계자가 지정
- 각 투플에 대한 기본 키 값은 항상 유효한 값이어야 함
- null 값이 허용되지 않음
- 대체 키(alternate key)
- 후보 키 중에서 기본 키를 제외한 나머지 후보 키
외래 키 (Foreign key)
- 외래 키(foreign key)
- 릴레이션 R의 애트리뷰트 (집합) FK가 릴레이션 S의 기본 키를 가리킬때, 이 FK는 R의 외래키이다.
- (R의 FK의 도메인)=(S의 기본 키의 도메인)
- 예: (등록테이블의 SNO)는 (학생테이블의 SNO)를 가리키는 외래키
- FK의 값은 S의 기본키에 존재하는 값이거나 null
- R과 S가 같은 릴레이션일 수도 있음
- R을 참조 릴레이션(referencing relation), S를 피참조 릴레이션 (referenced relation)이라 함
- 릴레이션 R은 FK를 통해 릴레이션 S를 참조
- 관계형 데이터 모델에서는 기본키와 외래키에 의해서 개체(entity) 간의 관계(relationship)을 유지함
- 기본키-외래키 개념은 관계형 데이터베이스의 핵심 아이디어
관계 유형과 외래키
- 1:1 관계
- 예) 개인: 면허증, 자동차: 자동차 등록증, 국가: 수도
- 릴레이션 설계: 한쪽은 기본키, 한쪽은 외래키로 연결
- 1:N 관계
- 예) 부모: 자녀, 강좌: 강의, 회사: 직원, 유튜버: 유튜브 동영상
- 릴레이션 설계: 1쪽에 기본키, N쪽에 외래키
- M:N 관계
- 예) 학생 : 과목, 배우: 영화, 상품: 주문, 프로젝트: 팀원
- 릴레이션 설계: 새로운 관계 테이블을 만들고, 양쪽의 기본키를 외래키로 배치
관계형 데이터베이스의 무결성 제약(Integrity Constraints)
- 개체 무결성(entity integrity)
- 기본 키 값은 언제 어느 때고 null 값을 가질 수 없고, 중복 값을 가질 수 없음.
- NOTE: null 값
- 정보 부재를 명시적으로 표현하는 특수한 데이타 값
- 알려지지 않은 값(unknown value)
- 해당 없음(inapplicable)
- 참조 무결성(referential integrity)
- 외래 키 값은 반드시 피참조 릴레이션의 기본 키 값으로 존재하는 값이거나 null이어야 함.
- 도메인 무결성(domain integrity)
- 애트리뷰트의 값이 해당 도메인에 속한 값이어야 한다는 규정.
이러한 무결성 제약조건은 데이타베이스 상태(database state)가 항상 만족시켜야 될 제약조건임
- 데이타베이스 상태 (database state)
- 어느 한 시점에 데이타베이스에 저장되어 있는 모든 데이타 값
- 어느 한 시점의 릴레이션 인스턴스의 집합
- 데이타베이스 상태는 계속적으로 변화함
- 삽입, 삭제, 변경 연산
DBMS는 데이타베이스 상태의 변화에도 항상 무결성 제약을 만족시키도록 해야 함
Student Relation
CREATE TABLE `student` ( `sno` int NOT NULL, `sname` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, `year` int NOT NULL DEFAULT '1', `dept` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `email` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `enter_date` datetime DEFAULT CURRENT_TIMESTAMP, `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`sno`), CONSTRAINT `year_const` CHECK (((`year` >= 1) and (`year` <= 4))) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Course Relation
CREATE TABLE `course` ( `cno` char(4) COLLATE utf8mb4_unicode_ci NOT NULL, `cname` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, `credit` int DEFAULT NULL, `dept` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `prname` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `enter_date` datetime DEFAULT CURRENT_TIMESTAMP, `update_date` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`cno`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Enrol Relation
CREATE TABLE `ENROL` ( `SNO` int NOT NULL, `CNO` char(4) COLLATE utf8mb4_unicode_ci NOT NULL, `GRADE` char(1) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `MIDTERM` int DEFAULT NULL, `FINAL` int DEFAULT NULL, `ENTER_DATE` datetime DEFAULT CURRENT_TIMESTAMP, `UPDATE_DATE` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`SNO`,`CNO`), KEY `CNO` (`CNO`), CONSTRAINT `enrol_ibfk_1` FOREIGN KEY (`SNO`) REFERENCES `STUDENT` (`sno`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `enrol_ibfk_2` FOREIGN KEY (`CNO`) REFERENCES `COURSE` (`cno`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `enrol_chk_1` CHECK (((`GRADE` >= _utf8mb4'A') and (`GRADE` <= _ utf8mb4'F'))) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;