관계(Relationship)란?
두 개 이상의 엔터티(Entity)가 서로 연관이 있는 상태
엔터티(Entity)란?
사람, 장소 등 관리하고자 하는 데이터들(Instance)의 논리적 집합
관계 패어링(Relationship Paring)
관계의 정의를 통해 고려해볼 때, 엔터티 안의 인스턴스가 모두 동일한 관계를 가지고 있다고 생각할 수 있지만 엔터티 안의 인스턴스는 개별적으로 관계를 가지게 됩니다.
예시
- 위 그림과 같이 학생 엔터티와 수업 엔터티가 있다고 가정하겠습니다.
- 학생 엔터티의 인스턴스인 김철수와 김길동은 각각 수업 엔터티의 인스턴스인 수학과 영어에 대해 서로 다른 관계를 가지고 있습니다.
- 김철수 인스턴스는 수학과 영어 인스턴스 모두와 관계를 가지고 있으며, 김길동 인스턴스는 영어 인스턴스와 관계를 가지고 있습니다.
- 이렇게 각 인스턴스 간에 개별적으로 관계를 가지는 것을 관계 패어링이라고 하며, 이러한 관계 패어링의 집합을 논리적으로 표현한 것을 관계라고 합니다.
관계의 분류
관계를 연결함에 있어 어떤 목적으로 연결되었느냐에 따라 존재에 의한 관계, 행위에 의한 관계로 분류할 수 있습니다.
- 존재에 의한 관계: 단순히 소속되어 있음으로써 연관성이 생기는 관계
- 행위에 의한 관계: 특정한 행위(어떠한 이벤트나 액션, 행위)를 함으로써 연관성이 생기는 관계
관계의 표기법
관계를 표기할 때에는 3가지 개념에 대해서 함께 표현해줍니다.
1) 관계명(Membership) : 관계의 이름
- 관계는 2개의 엔터티에 의해 발생되므로, 하나의 관계는 2개의 관계명을 가지게 됩니다.
- [ 주문 목록(포함한다) - 목록(포함된다) ]
- 관계명은 능동적이거나 수동적으로 명명되며, 과거/미래형이 아닌 현재형으로 표현합니다.
- (포함했다(X), 포함한다(O))
2) 관계 차수(Cardinality) : 두 개의 엔터티 간 관계에서 참여자의 수를 표현한 것
- 가장 일반적인 관계 차수 표현방법으로는 크게 1:1, 1:M, M:N 표현 방식이 있습니다.
1:1 관계(일대일 관계)
- 어느 엔티티 쪽에서 상대 엔티티와 반드시 단 하나의 관계를 가지는 것
1:N 관계(일대다 관계)
- 한쪽 엔티티가 관계를 맺은 엔티티 쪽의 여러 객체를 가질 수 있는 것
N:M 관계(다대다 관계)
- 관계를 가진 양쪽 엔티티 모두에서 1:N 관계를 가지는 것
3) 관계 선택사양(Optionality) : 엔터티가 항상 관계에 참여하는지, 선택적으로 참여할 수 있는 것인지를 표현한 것
- 표현 방법으로는 필수 참여 관계와 선택 참여 관계가 있습니다.
예시
- 학생 엔터티와 수업 엔터티가 있을 경우
- 수업 엔터티는 학생 엔터티가 관계가 필수적이기 때문에 수업 엔터티를 기준으로 수업-학생 관계는 필수 참여 (Mandatory Membership) 관계입니다.
- 학생 엔터티는 수업 엔터티와 관계가 있을 수도 있고 없을 수도 있기 때문에 학생 엔터티를 기준으로 학생-수업 관계는 선택참여 (Optional Membership) 관계입니다.
어떻게 관계를 설정하면 좋을까?
먼저 두 개의 엔터티 사이에서 관계를 정의할 때 다음 사항을 먼저 체크합니다.
- 두 엔터티 사이에 연결에 대한 연관 규칙이 존재하는가?
- 두 엔터티 사이에 정보의 조합이 발생되는가?
- 두 엔터티 사이에 관계 연결에 대한 규칙이 서술되어 있는가? (관계 참여도(개수))
- 두 엔터티 사이에 관계 연결을 가능하게 하는 동사(Verb)가 있는가? (관계 선택사양, 관계명)
주의해야 할 사항
- 관계는 데이터베이스에서 칼럼의 비어있는 데이터 공간을 최소화하기 위한 수단입니다.
- 관계를 만들면 공간적으로는 효율적이지만 연관성 있는 테이블을 서로 참조하는 구조이다 보니 서로 참조하는 테이블이 많아질수록 속도가 느려지는 문제가 있습니다.
- 현상을 최대한 줄이기 위해 테이블을 어디까지 분리를 해놓아야 하는가에 대한 고민을 해야 합니다.
마무리
최근 DB 테이블을 설계를 하다가 관계 설정에 대하여 헷갈리기에 관계에 대하여 공부한 내용을 정리해보았습니다.
공부 전에는 관계 설정에 대한 설계는 관계 참여도만 확인하여 설계를 하였습니다. 공부를 해보니 설계 시 관계 참여도 수뿐 아니라 몇 가지 더 확인을 해야 한다는 것을 깨달았습니다.
아직 부족하거나 틀린 부분이 있을 수도 있으니 주의하시면 좋을 거 같습니다.
이번 포스팅은 마무리하면서 다음 포스팅에서 뵙겠습니다.
'데이터베이스' 카테고리의 다른 글
[DB] 정규화란? (0) | 2022.07.28 |
---|---|
[DB] DBMS의 키(key)의 개념과 종류 (0) | 2022.06.06 |
인덱스(Index)란? (0) | 2021.11.10 |
트랜잭션이란? (0) | 2021.10.28 |