본문 바로가기
컴퓨터

[데이터 베이스] 관계형 데이터베이스 매핑(Mapping)

by skyjwoo 2020. 6. 12.
728x90
반응형

데이터 베이스를 설계함에 있어서 ER(또는 EER)모델을 만들었다면, 그 후에 할 일은 이를 DBMS에서 이해할 수 있는 논리적 단계로 mapping시키는 것이다. 

 

좀 어려운 부분이 이진 관계에 대한 mapping이라 생각되어 그 부분에 대해 중점적으로 다루고자 한다. 

 

이진 관계는 Entity 사이의 가장 기본적인 관계로 대부분의 관계가 이진관계이다. 종류는 최대 카디널리티에 따라 1:N(one to many), 1:1(one to one), N:M(many to many)로 구분될 수 있고, 최소 카디널리티도 고려될 수 있다.(partial, total paticipation)

 

Mapping 방법으로는 Merge(두 Entity type을 합한다.), Foreign key(관계형 DB의 전형적인 방식), Relationship relation 추가(관계를 표현하는 새로운 relation 추가)이 있다.

 

 

1. 1:1 이진 관계 타입

우선 1:1관계부터 살펴보자면, 위의 3가지 mapping방법이 모두 가능하다. 

1:1 대응은 다음과 같이 두 relation의 instance들이 1:1로 대응하는 경우를 말한다. 아래 도식은 양 쪽 모두 관계에 참여하고 있으므로 전체 참여(total participation)이다. 이 때 우리는 merge가 가능하다. (물론 FK와 새 관계 relation을 만드는 방법도 가능하다.)

 

1) 둘 다 전체 참여

양 쪽 모두 전체 참여

S를 Student라 하고, T를 Teacher라 해보자. 그리고 학생 수가 매우 적어 한 학생에 한 선생님이 배정될 수 있다고 하자.

Student의 구성이 다음과 같다고 하자.

S_id 학년
A 1
B 2
C 3

Teacher의 구성이 다음과 같다고 하자.

T_id 경력
3
5
2

그럼 merge를 통해 다음과 같은 relation을 예상해 볼 수 있다.

 

S_id T_id s_학년 t_경력
A 1 3
B 2 5
C 3 2

 

 

merge 시 장점: join overhead가 없다. 따로 join해서 쓸 필요 없다. 그 테이블 자체가 이미 join된 상태.

이 때 pk(기본 키)는 S_id나 T_id 둘 중 하나로 하면 되고, Candidate key(후보키) Pk가 아닌 나머지 키를 선택하면 된다.

부분 참여인 경우 merge가 안 되는 이유는 merge를 한다고 해도 null값이 있기에 PK를 정할 수가 없다.       

 

*merge 외에도 아무 쪽에나 FK(Foreign key, 외래키)를 두고 관계를 표현할 수도 있다.                                                                                                                                                                                                   

2) 한 쪽만 전체 참여, 다른 한 쪽은 부분 참여               

 

1:1 중 한 쪽만 전체 참여인 경우, 주로 전체 참여인 Entity에 FK를 두고 반대쪽 Entity를 참조하도록 한다. 전체 참여인 쪽에 FK를 두는 이유는, 그래야 FK의 값에 Null값을 넣지 않아도 되기 때문이다. Null값이 들어가면 안 좋은 이유는 해석을 애매하게 하고, join을 하기 어렵기 때문이다.

 

한 쪽은 전체 참여, 한 쪽은 부분 참여

위의 학생, 선생님 예시를 다시 가져와 보자. 이번에는 선생님 쪽에 교장 선생님을 추가하도록 하겠다. 교장선생님은 특정 학생을 전담하지 않는다. 따라서 학생 entity는 전체 참여이지만, 선생님 entity는 부분 참여가 된다.

 

이러한 경우를 mapping하는 방법은 위에서도 말했듯이 FK를 이용하는 방법이 주로 쓰인다. (merge는 Null값이 발생하여 불가능하다.) FK는 전체 참여하는 relation에 붙는다. 이는 다음과 같이 구성할 수 있다. 

 

여기서 FK가 쓰였기 때문에 FK의 제약 조건을 고려해 본다면, 전체 참여이기에 not null, 1:1 대응이기에 unique가 붙게 된다.(FK값은 1:1대응에서 unique할 수밖에 없다.)

 

S_id 학년 teacher
A 1
B 2
C 3

 

T_id 경력
3
5
2
20

 

3) 둘 다 부분 참여인 경우

도식을 그려보면 다음과 같다. 

둘 다 optional, partial participation 한 경우

 

이 경우에는 주로 새 관계 relation을 만든 후 그 relation에 S와 T의 PK를 넣는 방식으로 mapping한다. 위의 학생-선생 예시를 다시 가져와서 이번엔 학생 중에 한 명이 전학온 지 얼마 되지 않아서 아직 선생님을 배정 받지 못한 상태라 해보자. 

 

여기서 주목할 점은 새로운 relation이 하나 추가 된다는 점이다. S의 PK와 T의 PK를 속성(attribute)으로 가지면서, 각각 S, T를 참조한다. 또한 이 둘 중 하나가 PK가 될 수 있다. 그리고 나머지 하나는 CK(후보키)가 된다. 이게 가능한 이유는 역시 1:1대응이기 때문이다. 하나의 값만으로 다른 쪽 값이 정해지게 된다. 학생들의 id만 알아도 선생님이 한 명으로 정해진다는 것이다.

FK를 쓰지 않고 이 방식을 주로 쓰는 이유는 앞에서 처럼 FK로 구성할 경우, null값이 발생하기 때문이다. 물론 이 방식에는 단점이 있다. S와 T를 join하기 위해선 관계 relation까지 join하는 과정이 포함되어 join을 두 번해야 한다. 

 

관계 relation에 대해 부연 설명하자면, FK는 S와 T값에 의존하기에 cascade 제약 조건을 달아준다. 

S_id 학년
A 1
B 2
C 3

 

T_id 경력
3
5
2
20

 

S_id(FK, PK) T_id(FK, CK)
A
C

 

2. 1:N 이진 관계 타입

이 경우에는 보통 N 쪽에 FK를 놓는 방식으로 표현한다. null값이 너무 많아질 것 같으면 relationship relation을 새로 만들어주기도 한다. Merge는 N(many) side가 존재하는 관계에서는 쓰지 않는데 필자의 생각으로는 데이터 중복이 나타나기 때문이라 생각된다. 1:1 대응에서는 데이터의 중복이 발생하지 않지만, 1:N, M:N의 경우, 전체 참여임을 고려한다면 어떻게든 두 번 이상 참조되는 tuple이 있기에 중복이 발생할 수밖에 없다. 또 중복은 여러 문제들을 야기하기에 피하는 게 좋다.

 

1:N관계를 그림으로 나타내 보면 다음과 같다. 

One teacher has many students이기에 T가 one side이고, S가 N-side이다. 다음과 같이 나타낼 수 있다.

S_id 학년 teacher(FK)
A 1
B 2
C 3

여기서 S가 전체 참여이기에 FK에 not null조건을 주면 된다. 그러나 Teacher가 전체 참여일 경우 따로 특별히 조건을 주어 확인하기 어렵다. 이 때는 assertion이나 Trigger를 통해 검사하도록 해야 한다. 

 

 

3. M:N 이진 관계 타입

다음과 같이 표현될 수 있다.

 

이 경우에는 새 관계 relation을 만들어서 쓴다. T를 선생님 대신 방과후 수업으로 보자. 학생들은 방과 후 수업을 여러 개 선택할 수 있고, 방과후 수업도 여러 학생들을 받을 수 있다. 따라서 N:M관계가 성립한다.

S_id(FK, PK) T_id(FK, PK)
A
B
B
C
C

S_id와 T_id가 모두 합쳐서 PK가 될 것이며, 이 둘은 모두 S와 T에 의존적이기에 cascade 조건을 달게 된다. 

728x90
반응형

댓글