
유튜브 쉬운코드 님의 관계형 데이터베이스(relational database)개념과 relation, primary key(기본키), foreign key(외래키), constraints를 알아봅시다 영상을 보고 정리한 글입니다.

Relation is a subset of the cartesian product of two sets.
Each pair (a, b) is a tuple of relation.
Relational Data Model에서 각각의 Set은 도메인을 의미한다.
도메인(Domain)은 값들의 집합을 말한다.
예) STUDENT Relation의 도메인 정의하기
- students_id : 학번들의 집합, 7자리 Integer
- human_namse : 이름의 집합, 문자열
- university_grades : 대학교 학년 집합, {1, 2, 3, 4}
- major_names : 대학교에서 배우는 전공 이름 집합, 문자열
- phone_numbers : 핸드폰 번호 집합, 10자리 Integer

각각의 도메인이 릴레이션에서 수행하는 역할의 이름을 말한다. 예를 들어, students_id 도메인은 STUDENT 릴레이션에서 id 역할을 수행한다고 보면 된다. 따라서 하나의 릴레이션 안에서 어트리뷰트의 이름은 중복이 될 수 없다.
각 속성(어트리뷰트)들이 가질 수 있는 값의 범위를 도메인이라 생각하면 쉽다. 어트리뷰트는 도메인을 벗어난 값을 가질 수 없기 때문이다.
참고로, 어트리뷰트는 atomic value만 가져야한다. 즉, 하나의 어트리뷰트에는 더이상 분리될 수 없는 하나의 값만 존재해야 한다.
위 그림에서도 볼 수 있듯이 릴레이션은 보통 테이블로 표현된다.
테이블의 각 행은 tuple이라고 한다. tuple은 어트리뷰트 하나하나의 값들로 이루어진 리스트이다. 그렇기 때문에 릴레이션은 튜플들의 집합(set of tuples)라고도 하며, 이는 relation state라고도 한다.
릴레이션은 튜플들의 집합이기 때문에 집합의 성질을 따른다. 중복된 튜플을 가질 수 없으며, 각 튜플들 사이에 순서가 존재하지 않는다. (참고로 어트리뷰트들의 순서도 중요하지 않다.)

릴레이션의 구조를 나타낸다.
예) STUDENT(id, name, grade, major, phone_num, emer_phone_num)
Relational Data Model에 기반하여 구조화된 데이터베이스를 의미한다. 따라서 여러 개의 relation들로 구성된다.
Relation schemas + Integrity constraints
릴레이션에서 각각의 튜플들을 unique하게 식별할 수 있는 어트리뷰트들의 집합을 말한다.
PLAYER(id, name, team_id, back_num, birth_date)라는 릴레이션에서 Super Key는 {id, name, team_id, back_num, birth_date}, {id, name}, {name, team_id, back_num} 등이 될 수 있다.
Super Key 중에서 어느 하나의 어트리뷰트를 제거했을 때 더이상 튜플들을 unique하게 식별할 수 없는 key를 말한다.
PLAYER 릴레이션에서 {id}, {team_id, back_num}이 해당된다.
Candidate Key 중에서 릴레이션에서 튜플들을 식별하기 위해 선택된 Key를 말한다. 보통 어트리뷰트 수가 적은 것을 선택한다.
PLAYER 릴레이션에서 {id}가 될 수 있다.
Candidate Key 중에서 PK가 되지 못 한 Key들을 말한다. Alternate Key라고도 한다.
다른 릴레이션의 PK를 참조하고 있는 어트리뷰트 집합을 말한다.
Relational Database의 릴레이션들이 언제나 지켜야 하는 제약사항을 의미한다.
릴레이션은 중복되는 튜플을 가질 수 없다.
릴레이션 내에서 어트리뷰트의 이름은 중복되어선 안 된다.
DDL을 통해 스키마에 직접 명시할 수 있는 제약사항을 말한다. Explicit constraints라고도 한다.
어트리뷰트의 값은 해당하는 도메인에 속한 값이어야 한다.
예를 들어, STUDENT 릴레이션의 grade 어트리뷰트는 university_grades 도메인에 해당하기 때문에 {1, 2, 3, 4} 중에서만 값을 가질 수 있다.
PK에 해당하는 값들은 중복되어서는 안 된다.
예를 들어, STUDENT 릴레이션의 PK가 id 어트리뷰트라고 한다면 그 어떤 튜플도 동일한 id 어트리뷰트 값을 가질 수 없다.
NOT NULL 속성을 가지는 어트리뷰트는 NULL 값을 가질 수 없다.
PK로 지정된 어트리뷰트는 NULL 값을 가질 수 없다.
PK는 각각의 튜플을 unique하게 식별하기 위해 존재하는데 NULL 값이 포함된다면 더이상 unique하게 식별할 수 없게 되기 때문이다.
FK와 PK의 도메인이 같아야 하며 PK에 없는 값은 FK에 존재할 수 없다.