본문 바로가기
2023-2/데이터베이스

2. 관계형 모델

by 철없는민물장어 2023. 9. 14.
728x90
반응형

1. 관계형 데이터베이스의 구조

1.1 기본적인 구조

Relational Database: 관계형 데이터베이스는

유일한 이름을 갖는 릴레이션(table)로 구성된다.

ER모델의 개체와 관계가 모두 릴레이션으로 표현된다.

 

릴레이션은 레코드와 필드로 구성된다.

 

릴레이션(relation)=테이블(table)

릴레이션은 스키마와 인스턴스로 구성.

스키마: 릴레이션 이름과 일정 수의 속성들의 집합

인스턴스: 릴레이션에 포함된 레코드들의 집합.

 

학생 테이블

학번 이름 전공 나이
1001 홍길동 새마을국제개발학 20
1002 나천재 천마인재 33

 

속성 = 열 = 필드

릴레이션에서 속성 이름은 상이해야한다.

속성의 수 = degree(차수)

 

행 = 레코드 = 튜플

Cardinality(기수) = 레코드 개수

 

도메인(domain)

각 속성에 허용되는 값들의 집합

ex) 학점(0~4.5)

 

더보기


**릴레이션(Relation) = 테이블(Table):**
- 릴레이션은 데이터베이스에서 표 형태로 정리된 데이터의 집합을 나타냅니다. 각 릴레이션은 스키마와 인스턴스로 구성됩니다.

**스키마(Schema):**
- 스키마는 릴레이션의 이름과 릴레이션에 속하는 속성(Attribute)들의 집합입니다. 예를 들어, 학생 테이블의 스키마는 "학번", "이름", "전공", "나이" 등의 속성으로 구성됩니다.

**인스턴스(Instance):**
- 인스턴스는 특정 릴레이션에 포함된 실제 데이터 레코드들의 집합입니다. 예를 들어, 학생 테이블의 인스턴스는 실제 학생들의 정보가 담긴 레코드들입니다.

**속성(Attribute) = 열(Column) = 필드(Field):**
- 릴레이션에서 속성은 각 열을 의미하며, 특정 종류의 정보를 담고 있습니다. 예를 들어, "학번", "이름", "전공", "나이"는 학생 테이블의 속성입니다.

**속성 이름의 고유성:**
- 하나의 릴레이션 내에서 속성 이름은 중복되지 않아야 합니다. 즉, 같은 릴레이션 내에서는 중복된 속성 이름을 사용할 수 없습니다.

**속성의 수 = degree(차수):**
- 릴레이션의 속성의 수를 차수(degree)라고 합니다. 예를 들어, 학생 테이블의 차수는 4입니다.

**행(Row) = 레코드(Record) = 튜플(Tuple):**
- 레코드는 릴레이션 내에서 각각의 행을 나타냅니다. 각 행은 하나의 레코드 또는 튜플로 불립니다. 예를 들어, 학생 테이블에서 각 학생의 정보가 하나의 레코드입니다.

**Cardinality(기수):**
- 레코드의 개수를 뜻합니다. 즉, 릴레이션에 포함된 실제 레코드의 개수를 나타냅니다.

**도메인(Domain):**
- 각 속성에 허용되는 값들의 집합을 도메인이라고 합니다. 예를 들어, "학점" 속성의 도메인은 0부터 4.5까지의 정수 값입니다.

이렇게 데이터베이스에서 사용되는 주요 용어들을 예시와 함께 설명해보았습니다.

1.2 릴레이션의 특징

- 한 테이블 내에서 레코드들은 모두 다르다.

- 레코드의 순서는 중요하지 않다

- 레코드의 삽입,삭제 등으로 릴레이션은 시간에 따라 변한다.(릴레이션의 변동성)

- 속성들의 순서는 중요하지 않다.(원칙상 그렇지만 DBMS에서 순서가 필요하기도)

- 릴레이션 내에서 속성들의 명칭은 서로 달라야 하지만, 값은 동일할 수 있다.(ex: A학생의 주소가 대구이면서 B학생의 주소도 대구)

- 단순 속성 및 단일 값 속성만 지원한다.=> 구조체, 배열 등을 값으로 가질 수 없다.

 

1.3. 데이터베이스 언어

Query Language(질의어): 사용자가 데이터베이스의 정보를 액세스하기 위해 사용하는 언어.

관계형 데이터베이스를 위한 국제 표준 언어: SQL

관계형 모델의 개념을 설명하기 위한 개념적인 언어: 관계 대수(Relational Algebra)


2. 관계 대수(Relational Algebra)

하나 이상의 릴레이션을 입력으로 하여 새로운 결과 릴레이션을 생성.

 

기본적인 연산자:

  • Select 
  • Project
  • Cartesian Product
  • Union
  • Set Difference

추가적인 연산자

  • Set Intersection
  • Join
  • Division

 

ER Diagram

https://ko.wikipedia.org/wiki/%EA%B0%9C%EC%B2%B4-%EA%B4%80%EA%B3%84_%EB%AA%A8%EB%8D%B8

엔티티는 사각형, 엔티티의 속성은 원, 엔티티와 엔티티사이 관계는 다이아몬드 모양으로 표현할 수 있다.

 

ER모델을 보고 관계형 모델의 스키마를 작성하는 방법.

1. 엔티티는 테이블로 작성한다.

2. 1:n 관계는 n쪽 테이블에 1쪽 테이블의 키를 추가한다.

3. n:n 관계는 별도의 테이블로 분리한다.


2.1.1 Select


Select 연산은 릴레이션에서 특정 조건을 만족하는 튜플들을 선택하여 새로운 릴레이션을 생성한다.

(즉, SQL의 WHERE절)

고객(Customer) 릴레이션에서 주소가 'New York'인 고객들을 선택하는 `Select` 연산을 수행한다고 가정해보겠습니다.
Select 연산 예시:
σ(Address='New York')(Customer)

결과:

| CustomerID | Name     | Address       |
|------------|----------|---------------|
| 1          | Alice    | New York      |
| 3          | Charlie  | New York      |



위 예시에서 `σ(Address='New York')(Customer)`는 주소가 'New York'인 고객들을 선택하는 `Select` 연산입니다. 결과로서 Customer 릴레이션에서 주소가 'New York'인 고객들의 정보가 포함된 새로운 릴레이션이 생성됩니다.


2.1.2 Project

프로젝션(Projection)은 특정 릴레이션에서 원하는 속성(열)들을 선택하여 새로운 릴레이션을 생성한다.(SQL에서 SELECT절)

 

학생(Student) 릴레이션에서 학번과 이름만을 선택하여 새로운 릴레이션을 생성한다고 가정해보겠습니다.
Student 릴레이션:

| StudentID | Name     | Major                  | Age |
|-----------|----------|-----------------------|-----|
| 1001      | Alice    | Computer Science      | 20  |
| 1002      | Bob      | Mathematics           | 21  |
| 1003      | Charlie  | Physics               | 22  |
| 1004      | David    | Chemistry             | 20  |



π(StudentID, Name)(Student)
결과:

| StudentID | Name     |
|-----------|----------|
| 1001      | Alice    |
| 1002      | Bob      |
| 1003      | Charlie  |
| 1004      | David    |



위 예시에서 `π(StudentID, Name)(Student)`는 학생 릴레이션에서 학번과 이름만을 선택하여 새로운 릴레이션을 생성하는 프로젝션 연산입니다. 결과로서 새로운 릴레이션에는 학번과 이름만이 포함됩니다.

즉, 프로젝션 연산은 원하는 속성들만을 선택하여 새로운 릴레이션을 만드는 역할을 합니다.

(중복제거)


프로젝션과 셀렉트를 함께 사용하는 예시

가정:
학생(Student) 릴레이션에서 전공이 'Computer Science'인 학생들의 학번과 이름만을 선택하는 경우를 생각해보겠습니다.

Student 릴레이션:

| StudentID | Name     | Major                  | Age |
|-----------|----------|-----------------------|-----|
| 1001      | Alice    | Computer Science      | 20  |
| 1002      | Bob      | Mathematics           | 21  |
| 1003      | Charlie  | Physics               | 22  |
| 1004      | David    | Computer Science      | 20  |



프로젝션과 셀렉트 연산 예시:
π(StudentID, Name)(σ(Major='Computer Science')(Student))

결과:

| StudentID | Name     |
|-----------|----------|
| 1001      | Alice    |
| 1004      | David    |


위 예시에서 `σ(Major='Computer Science')(Student)`는 전공이 'Computer Science'인 학생들을 선택하는 셀렉트 연산입니다. 그리고 이 결과에 대해 `π(StudentID, Name)` 연산을 수행하여 학번과 이름만을 선택하는 프로젝션 연산을 적용했습니다.

결과로서 'Computer Science' 전공을 가진 학생들의 학번과 이름만이 포함된 새로운 릴레이션이 생성됩니다.


2.1.3 Union

Union 연산은 두 개의 릴레이션을 합치는 연산입니다. 이때, 중복된 튜플은 하나로 취급하여 결과 릴레이션을 만듭니다.
(합집합)

 

이때 두 릴레이션은 동일한 스키마를 가져야 한다.(속성 수와 타입이 동일해야한다)


예를 들어, A와 B 두 개의 릴레이션이 있다고 가정해보겠습니다.

A 릴레이션:

| ID | Name    |
|----|---------|
| 1  | Alice   |
| 2  | Bob     |
| 3  | Charlie |


B 릴레이션:

| ID | Name    |
|----|---------|
| 4  | David   |
| 5  | Eve     |



그리고 Union 연산을 수행하면 중복된 튜플을 제외하고 두 릴레이션의 합집합을 얻습니다.

Union 연산 예시:
A ∪ B

결과:

| ID | Name    |
|----|---------|
| 1  | Alice   |
| 2  | Bob     |
| 3  | Charlie |
| 4  | David   |
| 5  | Eve     |


위의 결과에서는 중복된 튜플이 제거되고, A와 B의 모든 튜플이 포함된 것을 확인할 수 있습니다.

2.1.4 Set Difference

Union과 반대로 릴레이션 a에는 속하지만 b에는 존재하지 않는 레코드들로 구성된 새로운 릴레이션을 생성한다.

(차집합)

 

A - B로 표현

마찬가지로 A와 B는 동일한 스키마를 가져야한다.(속성 수, 타입, 도메인 동일)


2.1.5 Cartesian Product

카테시안 곱은 두 개의 릴레이션에서 가능한 모든 조합을 만들어 새로운 릴레이션을 생성하는 연산입니다.

결과 릴레이션의 크기는 첫 번째 릴레이션의 튜플 수와 두 번째 릴레이션의 튜플 수의 과 같습니다.

예를 들어, A와 B 두 개의 릴레이션이 있다고 가정해보겠습니다.

A 릴레이션:

| ID | Name    |
|----|---------|
| 1  | Alice   |
| 2  | Bob     |


B 릴레이션:

| Age | Grade |
|-----|-------|
| 20  | A     |
| 21  | B     |


그리고 Cartesian Product 연산을 수행하면 가능한 모든 조합을 만들어 새로운 릴레이션을 생성합니다.

카테시안 곱 연산 예시:
A × B

결과:

| ID | Name   | Age | Grade |
|----|--------|-----|-------|
| 1  | Alice  | 20  | A     |
| 1  | Alice  | 21  | B     |
| 2  | Bob    | 20  | A     |
| 2  | Bob    | 21  | B     |


위의 결과에서 볼 수 있듯이, 가능한 모든 조합이 생성되어 새로운 릴레이션이 형성되었습니다. 이는 A 릴레이션의 각 튜플과 B 릴레이션의 각 튜플이 모든 가능한 조합으로 조합된 결과입니다.


카테시안 곱과 셀렉트를 함께 사용하여 조인을 수행하는 예시
가정:
두 개의 릴레이션이 있다고 가정합니다.

A 릴레이션:

| ID | Name    |
|----|---------|
| 1  | Alice   |
| 2  | Bob     |


B 릴레이션:

| ID | Age |
|----|-----|
| 1  | 20  |
| 2  | 25  |


카테시안 곱과 셀렉트를 활용한 조인 예시:
σ(A.ID = B.ID)(A × B)

결과:

| A.ID | A.Name | B.ID | B.Age |
|------|--------|------|-------|
| 1    | Alice  | 1    | 20    |
| 2    | Bob    | 2    | 25    |


위의 예시에서 먼저 A와 B의 카테시안 곱을 생성합니다. 그런 다음 셀렉트 연산을 사용하여 A의 ID와 B의 ID가 동일한 튜플만 선택합니다. 이 결과로 두 릴레이션을 조인한 결과를 얻게 됩니다.


2.2 추가적인 연산자

2.2.1 Set Intersection

교집합.

집합 교집합은 두 개의 릴레이션에서 동일한 튜플만을 선택하여 새로운 릴레이션을 생성하는 연산입니다.

(r ∩ s = r - (r - s) 이므로 기본적인 연산자로도 표현가능하다.)

r과 s는 동일한 스키마를 가져야 한다.


예를 들어, A와 B 두 개의 릴레이션이 있다고 가정해보겠습니다.


A 릴레이션:

| ID | Name    |
|----|---------|
| 1  | Alice   |
| 2  | Bob     |
| 3  | Charlie |


B 릴레이션:

| ID | Name    |
|----|---------|
| 1  | David   |
| 2  | Bob     |
| 3  | Charlie |


집합 교집합 연산 예시

A ∩ B


결과:

| ID | Name    |
|----|---------|
| 2  | Bob     |
| 3  | Charlie |


위의 결과에서 볼 수 있듯이, A와 B의 교집합인 릴레이션은 두 릴레이션에서 동일한 ID를 가진 튜플만을 포함합니다. 이는 집합 교집합 연산의 결과입니다.


2.2.2. Join

조인은 두 개 이상의 릴레이션을 결합하여 새로운 릴레이션을 생성하는 연산입니다. 조인은 일반적으로 두 릴레이션 사이에 공통된 속성(키)이 있어야 합니다.

  • natural join
  • theta join
  • equi join

자연 조인(Natural Join) 

자연 조인은 두 개의 릴레이션에서 동일한 이름과 동일한 값을 가지는 속성을 기준으로 조인하는 연산입니다. 이때, 동일한 이름과 값을 가지는 속성을 기준으로 조인이 이루어집니다.

예를 들어, A와 B 두 개의 릴레이션이 있다고 가정해보겠습니다.

A 릴레이션:

| ID | Name    | Age |
|----|---------|-----|
| 1  | Alice   | 20  |
| 2  | Bob     | 25  |


B 릴레이션:

| ID | Grade |
|----|-------|
| 1  | A     |
| 2  | B     |


A NATURAL JOIN B

결과:

| ID | Name  | Age | Grade |
|----|-------|-----|-------|
| 1  | Alice | 20  | A     |
| 2  | Bob   | 25  | B     |


위의 예시에서는 A와 B의 자연 조인을 수행했습니다. 이때, ID 속성이 동일한 값을 가지므로 이를 기준으로 조인이 이루어졌습니다. 결과로 두 릴레이션을 조인한 결과를 얻게 됩니다.


Theta Join 세타 조인

관계대수의 세타 조인은 일반적인 조인 연산입니다. 이 조인은 등호가 아닌 다른 비교 연산자(부등호, 등등)를 사용하여 두 릴레이션을 결합합니다.

Equi Join

 이퀴조인은 특정 열의 값이 서로 동일한 경우에만 두 테이블을 조인합니다. 즉, 등호를 사용하여 두 테이블을 연결합니다.

차이점
네추럴 조인은 두 테이블 간에 동일한 이름을 가진 모든 열을 기반으로 조인하는 반면, 세타 조인은 등호 이외의 다른 비교 연산자를 사용합니다.
이퀴조인은 두 테이블 간에 조인 조건으로 등호를 사용합니다.

예를 들어, A와 B라는 두 테이블이 있을 때:

A 테이블:

| ID | Name  |
|----|-------|
| 1  | Alice |
| 2  | Bob   |


B 테이블:

| ID | Grade |
|----|-------|
| 1  | A     |
| 3  | B     |


- 네추럴 조인: A와 B의 네추럴 조인은 ID 열을 기반으로 이루어집니다.
- 세타 조인: A와 B의 세타 조인은 ID가 서로 다른 경우에 조인될 수 있습니다. 예를 들어, `A.ID ≠ B.ID`와 같은 조건을 사용할 수 있습니다.
- 이퀴조인: A와 B의 이퀴조인은 ID가 서로 동일한 경우에 조인됩니다. `A.ID = B.ID`와 같은 조건을 사용합니다.

 

네추럴 조인은 공통 속성을 하나의 속성만 나타내지만 세타조인과 이퀴조인은 공통 속성을 중복하여 출력한다.


Outer Join

외부 조인(Outer Join)은 두 개의 테이블을 연결할 때, 일치하지 않는 행도 포함하여 결과를 반환하는 연산입니다. 외부 조인에는 왼쪽 외부 조인(Left Outer Join), 오른쪽 외부 조인(Right Outer Join), 전체 외부 조인(Full Outer Join)이 있습니다.

1. 왼쪽 외부 조인 (Left Outer Join):
   - 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 행들을 연결합니다. 오른쪽 테이블에서 일치하는 행이 없는 경우에는 NULL 값으로 채웁니다.
   
   예를 들어, A와 B 두 테이블이 있다고 가정하겠습니다.

   A 테이블:

   | ID | Name  |
   |----|-------|
   | 1  | Alice |
   | 2  | Bob   |
   | 3  | Carol |

 

 B 테이블:

   | ID | Grade |
   |----|-------|
   | 1  | A     |
   | 3  | B     |

 

왼쪽 외부 조인: A 왼쪽 외부 조인 B는 A의 모든 행을 포함하며, B와 ID가 일치하는 경우에는 해당 행을 함께 포함합니다.

결과:

   | A.ID | A.Name | B.ID | B.Grade |
   |------|--------|------|---------|
   | 1    | Alice  | 1    | A       |
   | 2    | Bob    | NULL | NULL    |
   | 3    | Carol  | 3    | B       |


2. 오른쪽 외부 조인 (Right Outer Join):
   - 왼쪽 테이블에서 일치하는 행들과 오른쪽 테이블의 모든 행을 연결합니다. 왼쪽 테이블에서 일치하는 행이 없는 경우에는 NULL 값으로 채웁니다.
   

예를 들어, 위와 같은 A와 B 테이블이 있다면,
오른쪽 외부 조인: A 오른쪽 외부 조인 B는 B의 모든 행을 포함하며, A와 ID가 일치하는 경우에는 해당 행을 함께 포함합니다.

   결과:

   | A.ID | A.Name | B.ID | B.Grade |
   |------|--------|------|---------|
   | 1    | Alice  | 1    | A       |
   | 3    | Carol  | 3    | B       |
   | NULL | NULL   | 5    | C       |


3. 전체 외부 조인 (Full Outer Join):
   - 왼쪽 테이블과 오른쪽 테이블의 모든 행을 연결합니다. 양쪽 테이블에서 일치하지 않는 행은 NULL 값으로 채웁니다.

   전체 외부 조인은 일반적으로 오라클과 같은 몇몇 DBMS에서 지원됩니다.

   결과:

   | A.ID | A.Name | B.ID | B.Grade |
   |------|--------|------|---------|
   | 1    | Alice  | 1    | A       |
   | 2    | Bob    | NULL | NULL    |
   | 3    | Carol  | 3    | B       |
   | NULL | NULL   | 5    | C       |


이렇게 외부 조인은 두 테이블을 연결하면서 일치하지 않는 행도 포함하여 결과를 반환합니다.

 


2.2.3 Division

관계대수에서 Division(나눗셈) 연산은 두 릴레이션(R1, R2)이 주어졌을 때, R1의 모든 튜플이 R2의 모든 튜플과 일치하는 경우에 해당하는 튜플을 찾습니다.

Division 연산은 일반적으로 사용되지 않으며, 현실 세계의 대부분의 상황에서는 사용할 수 없거나 결과가 없을 수 있습니다. 이를 위해 일반적으로 다른 연산들을 활용하는 것이 더 효과적입니다.

예를 통해 Division을 이해해보겠습니다.
물론, 더 많은 예시를 통해 Division 연산을 이해해보겠습니다.

가정:
두 개의 릴레이션 R1과 R2가 있다.

R1:

| X | Y | Z |
|---|---|---|
| 1 | 2 | 3 |
| 1 | 3 | 4 |
| 2 | 2 | 3 |
| 2 | 3 | 4 |
| 3 | 2 | 3 |
| 3 | 3 | 4 |


R2:

| Y | Z |
|---|---|
| 2 | 3 |
| 3 | 4 |


이때 R1을 R2로 나누는 Division 연산을 수행하면 R1의 모든 튜플이 R2의 모든 튜플과 일치하는지를 확인합니다.

Division(R1 ÷ R2):

| X |
|---|
| 1 |
| 2 |
| 3 |


위의 결과에서 R1의 모든 튜플이 R2의 모든 튜플과 일치하는 경우를 찾아내었습니다. 

여기서, R1의 튜플 (1, 2, 3), (1, 3, 4)는 R2의 모든 튜플 (2, 3), (3, 4)와 일치하며, 마찬가지로 다른 경우들도 모두 일치합니다. 이런 경우들이 Division 연산의 결과로 반환됩니다.

 

728x90
반응형

'2023-2 > 데이터베이스' 카테고리의 다른 글

6. ER 모델을 이용한 데이터 모델링  (0) 2023.10.21
5. 데이터베이스 응용 개발  (0) 2023.10.21
4. 고급 SQL  (0) 2023.10.12
3. SQL  (0) 2023.09.26
정보 시스템  (0) 2023.09.12

댓글