# Ch05-1.md

## 관계 데이터 모델

![relationimg](https://164236779-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fufm8YXDUrO3hDbgkKUHw%2Fuploads%2Fgit-blob-97f84d89888a6e0d8a1bf31592efa2ac31afa7b6%2Frelation.png?alt=media)

* 일반적으로 관계 데이터 모델에서는 하나의 개체에 관한 데이터를 릴레이션(relation)에 담는다.
* 관련 용어
  * 속성(Attribute)
    * \== 열(column), Field
  * 튜플
    * \== 행(row), record
  * 도메인
    * 속성 하나가 가질 수 있는 모든 값의 집합
    * 가능한 값을 일일이 나열하기 어려운 경우가 대부분이라 일반적으로 속성의 특성을 고려한 **데이터 타입**으로 정의한다.
    * 데이터 타입 == 도메인 : 변수 == 속성
  * 널 값
    * 특정 튜플의 속성 값을 모르거나, 적합한 값이 없는 경우 null을 사용
    * Not a zero(0) and blank

      > DBMS마다 널값을 표시하는 기호가 다름
  * 차수
    * 속성의 전체 개수
  * 카디널리티
    * 투플의 전체 개수
* Relation
  * Relation schema
    * 릴레이션의 이름과 릴레이션에 포함된 모든 속성의 이름으로 정의하는 논리적 구조
    * ex) relation\_name(attribute\_name\_1,attribute\_name\_2,...,attribute\_name\_N)
  * Relation Instance
    * 어느 한 시점에 릴레이션에 존재하는 튜플들의 집합
    * DML을 사용해 검색, 수정, 삽입 등의 작업을 수행
  * 특정 데이터베이스 스키마를 설계한다는 것은 *필요한 모든 릴레이션의 스키마를 모두 정의하는 것*
  * 특성
    * 튜플의 유일성
      * 하나의 릴레이션에는 동일한 튜플이 존재할 수 없다.
      * 또한 다른 튜플들과 구별되는 유일한 특성이 존재해야한다.
        * 유일한 특성: **Key**
    * 튜플의 무순서
      * 하나의 릴레이션에서 튜플사이의 순서는 무의미하다.
      * DB는 위치가 아닌 내용으로 검색되기 때문
    * 속성의 무순서
      * 하나의 릴레이션에서 속성 사이의 순서는 무의미하다.
      * 속성 값은 위치가 아닌 속성의 이름으로 접근하기 때문에
        * 이름이 같은 속성이 존재할 수 없고
        * 의미가 명확히 드러나는 이름으로 사용하는 것이 좋음
    * 속성의 원자성
      * 속성 값으로 원자 값만 사용할 수 있다.
      * 원자 값이란?
        * 더는 분해할 수 없는 값
        * 다중 값을 가질 수 없음
        * 관계데이터 모델은 릴레이션을 단순한 구조로 정의하고자 하는 특징이 있기 때문

## Key

* 튜플을 구별하기 위한 속성
* 종류
  * 슈퍼키
  * 후보키
  * 기본키
  * 대체키
  * 외래키

### 슈퍼키

* 개념
  * 유일성의 특성을 만족하는 속성 또는 속성들의 집합
  * 유일성(uniqueness)
    * 하나의 릴레이션에서 키로 지정된 속성 값은 튜플마다 달라야한다.

### 후보키

* 개념
  * 유일성과 최소성을 만족하는 속성 또는 속성들의 집합
  * 최소성(minimality)
    * 꼭 필요한 최소한의 속성들로만 키를 구성하는 특성

### 기본키

* 개념
  * 여러 후보키 중에서 기본적으로 사용할 키
  * 기본키 선택 고려사항
    * 널 값을 가질 수 있는 속성이 포함된 후보키는 부적합
    * 값이 자주 변경될 수 있는 속성이 포함된 후비키는 부적합
    * 단순한 후보키를 선호

### 대체키

* 개념
  * 기본키로 선택되지 못한 후보키

### 외래키

* 개념
  * 어떤 릴레이션에 소속된 속성 또는 속성 집합이 다른 릴레이션의 기본키가 되는 키 ![fkimg](https://164236779-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fufm8YXDUrO3hDbgkKUHw%2Fuploads%2Fgit-blob-93c88e9b2ed0a6e33e0fe3910b495af427cee62e%2Ffkimg.png?alt=media)
  * 위의 이미지에서 주문고객 속성이 고객 릴레이션의 고객아이디를 참조하고 있으므로 주문고객 속성은 외래키이다.
  * '참조하는 릴레이션': 외래키를 가진 릴레이션
  * '참조되는 릴레이션': 참조되는 기본키를 가진 릴레이션
  * 외래키 속성과 참조되는 기본키 속성의 도메인(데이터 타입)은 같아야 한다.
    * 비교연산을 수행해야 하기 때문
