CS/DataBase

Relation과 key

reko_ 2022. 3. 28. 23:41

Relational model

데이터들을 어떻게 조직, 생성, 조작하는가 또한 어떻게 규칙을 줄 것인가에 따라 사용하는 데이터베이스가 사용하는 모델이 달라집니다.

 

 

우리가 보통 알고 있고, 사용하는 데이터베이스는 Relational model입니다.

추가적으로 Relation model을 생성하기 전에 디자인 단계의 모델을 Entity-Relationship data model(E-R model)이라고 합니다.

C의 UML과 비슷한 개념이라고 생각하면 될 것 같습니다.

.

.

.

이제 Relational model의 특징을 알아보겠습니다.

 

출처 - 네이버 투케이 블로그

 

 

데이터는 relation이라고 불리는 테이블에 저장할 수 있습니다.

 

 

tuple

하나의 튜플은 각 attribute를 나타내는 요소들의 집합을 말합니다. 집합이라고 해서 다른 튜플과 중복이 허용되는 것이 아닙니다. tuple은 순서가 있는 요소들의 집합입니다. (pair -> tiple -> n-tuple)

 

 

Attribute

위의 relation의 이름이 character라고 한다면 character relation의 scehma가 가지는 attribute는 다음과 같이 표현합니다.

character(이름, 나이, 성별)

 

domain

domain은 attribute에 기입될 수 있는 값들을 말합니다.

 

 

만약 attribute가 사람의 키 라고 했을 때 도메인은 [100, 200] 같은 연속적인 값일 수 있고

attribute가 사람의 성별이라고 했을 때 도메인은 남성, 여성 같은 불연속적인 값일 수 있습니다.

 

 

또한 도메인은 atomic(쪼개질 수 없는)이라는 특징을 가지고 있습니다.

예를 들어 attribute가 날짜이고 2022.03.28라는 도메인을 가지고 있을 때 이 도메인에서 년도 정보만 쓰고 싶다고 해서 2022라는 데이터만 따로 조회하여 사용할 수 없습니다.

 

 

key

key는 attribute의 부분집합입니다.  튜플들을 구분짓는 역할을 하고 있습니다.

 

 

보통 데이터베이스에서 key라고 하면 primary key 이고 이것은 튜플 각각을 구분할 수 있는 고유한 값을 말합니다.

예를 들어 중, 고등학교의 반 번호, 대학교의 학번 같이 학생 개개인이 가지고 있는 고유한 primary key 라고 할 수 있습니다.

 

하지만 primary key 뿐만 아니라 그 역할에 따라 여러 종류의 key가 존재합니다.

 

Super key

- 모든 도메인이 중복되지 않는 attribute를 super key라고 합니다.

위 그림에선 ID, name, dept_name, salary로 만든 모든 조합이 super key에 해당합니다. ex) (ID, name), (ID, salary)

 

Cadidate key

- 여러 key 중 가장 최소 단위로 나타낼 수 있는 super key를 candidate key라고 합니다. super가 cadidate를 포함합니다.

위 그림에선 모든 attribute 하나하나가 cadidate key 역할을 할 수 있습니다.

 

Primary key

- cadidate key 중 각 도메인들을 구분할 하나의 key만 지정한 것을 primary key라고 합니다.

위 그림에선 네개의 attribute중 하나만 primary key 지정할 수 있고, 보통 ID값으로 지정하여 사용합니다.

 

Foreign key

- 특정 relation의 cadidate key 중 다른 relation에서 primary key로 사용하는 cadidate key를 말합니다.

아래 그림에서 instructor relation의 dept_name가 department relation의 primary key로 사용되고 있습니다.

 

 

 

instructor은 department의 depth_name을 foreign key로 참조 하는 referencing relation이고,

department는 depth_name을 instroctor의 foreign key로 참조 당하는 referenced relation입니다.