[DB 이론] #2_관계(Relationship)와 식별자(Identifiers)
안녕하세요. 문범우입니다.
이번 포스팅에서는 DataBase에서 데이터 모델 개념에 속하는 관계(Relationship)와 식별자(Identifiers)에 대해서 알아보도록 하겠습니다.
1. 관계(Relationship)
1-1. 관계(Relationship)란?
사전적으로 정의했을 때, 관계란 상호 연관성이 있는 상태라고 할 수 있다. 이를 우리가 학습하고자 하는 데이터 모델의 개념에서 생각하면, 엔터티의 인스턴스 간 논리적인 연관성이라고 생각할 수 있고 보다 구체적으로는, 존재의 형태로서나 행위로서 서로에게 연관성이 부여된 상태라고 할 수 있다.
이러한 관계는 엔터티와 엔터티 간 연관성을 표현하기 때문에 특정 엔터티의 정의에 따라 영향을 받기도 하고, 속성 정의 및 관계 정의에 따라서도 다양하게 변경될 수 있다.
1-2. 관계의 패어링(Relationship Paring)
관계에 대해서 생각할 때 유의해야할 점이 있다.
위에서 설명한 관계의 정의를 통해 고려해볼 때, 엔터티 안의 인스턴스가 보두 동일한 관계를 가지고 있다고 생각할 수 있지만, 엔터티 안의 인스턴스는 개별적으로 관계를 가지게 되고 이것의 집합을 관계로 표현한다.
그리고 이때, 각각의 엔터티의 인스턴스들이 자신과 관련된 인스턴스들과의 관계를 어커런스로 참여하는 형태를 관계 패어링(Relationship Paring)이라고 한다.
즉, 위의 그림과 같이 학생 엔터티와 수업 엔터티가 있다고 생각해보자. 이때 학생 엔터티의 인스턴스인 김철수와 김길동은 각각 수업 엔터티의 인스턴스인 수학과 영어에 대해 서로 다른 관계를 가지고 있다. 김철수 인스턴스는 수학과 영어 인스턴스 모두와 관계를 가지고 있으며 김길동 인스턴스는 영어 인스턴스와 관계를 가지고 있다. 이렇게 각 인스턴스간 관계가 설정되어 있는 어커런스를 관계 패어링이라고 하며, 이러한 관계 패어링의 집합을 관계라고 한다.
1-3. 관계의 분류
1-3-1. 연결 목적에 따른 분류
아래와 같이 '존재에 의한 관계', '행위에 의한 관계' 두개로 나뉘어지는데 이는 어떠한 목적으로 관계가 연결되었느냐를 기준으로 한다.
- 존재에 의한 관계
예를 들어, '학부/과' 라는 엔터티와 '학생'이라는 엔터티가 존재한다고 가정하자. 이때 '학생' 엔터티의 특정 인스턴스는 언제든지 '학부/과' 엔터티의 특정 인스턴스에 속해있을 것이다. 이는 어떠한 이벤트나 액션, 행위에 의한 것이 아니라 단순히 소속되어 있기 때문에 나타나는 관계이다. 이러한 경우를 존재에 의한 관계라고 한다.
- 행위에 의한 관계
예를 들어, '손님'이라는 엔터티와 '주문'이라는 엔터티가 있다고 가정해보자. 각 엔터티의 특정 인스턴스 끼리는 관계가 발생하기 위해 '손님'이라는 엔터티의 인스턴스가 특정 행위를 해야한다. 이러한 관계를 행위에 의한 관계라고 이야기를 한다.
1-4. 관계의 표기법
관계를 표기할 때에는 아래와 같이 3가지 개념에 대해서 함께 표현해준다.
1-4-1. 관계명(Membership)
관계명은 엔터티가 관계에 참여하는 형태를 지칭한다. 관계는 2개의 엔터티에 의해 발생되므로, 하나의 관계는 2개의 관계명을 가지게 되며, 각각의 관게명에 따라서 하나의 관계가 두가지 관점으로 표현될 수 있다.
이때, 엔터티에서 관계가 시작되는 쪽을 관계시작점이라고 부르고 관계가 끝나는 쪽을 관계끝점이라고 한다. 관계명을 지을 때는 아래와 같은 명명규칙을 따른다.
- 애매한 동사를 피한다. 예를 들어 '관련이 있다', '관계된다' 등은 구체적이지 않아 두 엔터티간에 어떤 행위/상태가 존재하는지 파악하기 어렵다.
- 현재형으로 표현한다. 예를 들어, '주문을 했다', '신청할 것이다'라는 식의 표현은 사용하지 않는다. 대신 '주문 한다', '신청 한다' 와 같이 표현한다.
1-4-2. 관계차수(Cardinality)
관계차수란, 관계에 참여하는 두 엔터티의 참여자수를 이야기한다. 일반적으로 1:1, 1:M, M:N으로 나타낸다. 즉 관계에 하나만 참여하는지, 아니면 그 이상(2개 이상)이 관계에 참여하는지를 파악하는 것이 중요하다.
각각의 관계에 대한 IE 표기법은 다음과 같다.
1-4-3. 관계선택사양(Optionality)
관계선택사양이라는 것은 엔터티가 항상 관계에 참여하는지, 아니면 선택적으로 관계에 참여할 수 있는 것인지를 의미한다. 이때 항상 관계에 참여하는 것을 필수 참여(Mandatory Membership)이고 선택적으로 관계에 참여하는 것을 선택 참여(Optional Membership)이라고 한다.
위와 같이 학생 엔터티와 수업 엔터티가 있을 때, 학생 엔터티는 수업 엔터티와 관계가 있을수도 있고 없을수도 있기때문에 학생 엔터티를 기준으로 학생-수업 관계는 선택참여가 된다. 따라서 위와 같이 동그라미표시를 한다. 반대로 수업 엔터티는 학생 엔터티가 관계가 필수적이기 때문에 수업 엔터티를 기준으로 수업-학생 관계는 필수 참여가 되고 이때에는 아무런 표시를 하지 않는다.
(학생이 듣지 않는 수업에 대해서는 고려하지 않았다.)
1-5. 관계 체크사항
두개의 엔터티 사이에서 관계를 정의할 때에는 다음과 같은 사항들을 체크해 보아야 한다.
- 두 개의 엔터티 사이에 관심있는 연관규칙이 존재하는가?
- 두 개의 엔터티 사이에 정보의 조합이 발생되는가?
- 업무기술서, 장표에 관계연결에 대한 규칙이 서술되어 있는가?
- 업무기술서, 장표에 관계연결을 가능하게 하는 동사(Verb)가 있는가?
Q. 관계 관련 문제
1. 다음 중 관계에 대한 설명으로 가장 부적절한 것은?
⑴ 관계는 존재적 관계와 행위에 의한 관계로 나누어볼 수 있다.
⑵ 관계의 표기법은 관계명, 관계차수, 식별성의 3가지 개념을 사용한다.
⑶ 부서와 사원 엔터티 간의 '소속' 관계는 존재적 관계의 사례이다.
⑷ 주문과 배송 엔터티 간의 '배송근거' 관계는 행위에 의한 관계의 사례이다.
2. 다음 중 두 개의 엔터티 사이에 정의한 관계를 체크하는 사항으로 가장 부적절한 것은?
⑴ 두 개의 엔터티 사이에 관심 있는 연관규칙이 존재하는가?
⑵ 두 개의 엔터티 사이에 정보의 조합이 발생되는가?
⑶ 업무기술서, 장표에 관계연결에 대한 규칙이 서술되어 있는가?
⑷ 업무기술서, 장표에 관계연결을 가능하게 하는 명사가 있는가?
2. 식별자(Identifiers)
2-1. 식별자(Identifiers)란?
우리는 앞에서 인스턴스들의 집합(조합)이 엔터티라고 했다. 그럼, 엔터티내에서 특정 인스턴스를 구별하는 방법은 무엇일까? 이를 위해서 식별자가 존재한다. 즉, 여러 개의 인스턴스를 담고 있는 엔터티에서 인스턴스를 구별하기 위한, 즉 엔터티를 대표하는 속성을 의미하며 하나의 엔터티에서는 반드시 하나의 유일한 식별자가 존재해야 한다.
데이터베이스 공부를 했던 사람이라면 키(Key)와 식별자를 동일하게 생각할 수 있는데, 식별자는 업무적으로 구분이 되는 정보이므로 논리 데이터 모델링 단계에서 사용하는 용어이며, 키(Key)는 데이터베이스에서 테이블에 접근을 하기 위한 것으로 물리 데이터 모델링 단계에서 사용하는 것으로 약간의 차이가 존재한다.
2-2. 식별자의 특징
여기서 알아보는 식별자의 특징에서는 사실상 주 식별자를 기준으로 한다. 이후에 알아볼 내용이지만 주 식별자 이외에 외부식별자라는 개념도 존재하는데, 외부식별자의 경우 주식별자의 특징과 일치하지 않으며 참조무결성 제약조건에 따른 특징을 갖는다.
그럼 주 식별자가 가지는 특징은 다음과 같다.
- 유일성
주식별자에 의해 엔터티내에 모든 인스턴스들을 유일하게 구분할 수 있어야 함
- 최소성
주식별자를 구성하는 속성의 수는 유일성을 만족하는 최소의 수가 되어야 함
- 불변성
주식별자가 한 번 특정 엔터티에 지정되면 그 식별자의 값은 변하지 않아야 함
- 존재성
주식별자가 지정되면 반드시 데이터 값이 존재 해야함(Null값 안됨)
2-3. 식별자의 분류
2-3-1. 대표성 유무에 따른 분류
- 주식별자(Primary Identifier)
엔터니 내에서 각 어커런스를 구분할 수 있는 구분자이며, 타 엔터티와 참조관계를 연결할 수 있는 식별자
- 보조식별자(Alternate Identifier)
엔터티 내에서 칵 어커런스를 구분할 수 있는 구분자이지만 대표성을 가지지 못해 참조관계 연결을 못함
2-3-2. 스스로 생성되었는지에 따른 분류
- 내부식별자
엔터티 내부에서 스스로 만들어지는 식별자
- 외부식별자(Foreign Identifier)
타 엔터티와의 관계를 통해 타 엔터티로부터 받아오는 식별자
2-3-3. 단일 속성인지에 따른 분류
- 단일식별자(Single Identifier)
하나의 속성으로 구성된 식별자
- 복합식별자(Composit Identifier)
둘 이상의 속성으로 구성된 식별자
2-3-4. 업무적 의미가 있는가에 따른 분류
- 본질식별자
업무에 의해 만들어지는 식별자
- 인조식별자
업무적으로 만들어지지는 않지만 원조식별자가 복잡한 구성을 가지고 있기 때문에 인위적으로 만든 식별자
2-4. 주식별자 도출기준
데이터 모델링에 있어서 주식별자를 도출하는 것은 중요한 작업이다. 주식별자를 도출하기 위한 기준은 아래와 같다.
- 해당 업무에서 자주 이용되는 속성을 주식별자로 정의한다.
- 명칭, 내역 등과 같이 이름으로 기술되는 것들은 가능하면 주식별자로 지정하지 않는다.
- 복합으로 주식별자를 구성할 경우 너무 많은 속성이 포함되지 않도록 한다.
2-5. 비식별자 관계(Non-Identifying Relationship)
부모 엔터티로부터 속성을 받았지만 이를 자식 엔터티의 주 식별자로 사용하지 않고 일반적인 속성으로 사용하게 되는 경우가 있는데 이러한 경우를 비식별자 관계(Non-Identifying Relationship)라고 한다. 다음의 네가지 경우에 대해서 비식별자 관계에 의한 외부속성을 생성한다.
1) 자식엔터티가 부모엔터티로부터 받은 속성이 반드시 필수 값이 아니기 때문에 부모 없는 자식이 생성될 수 있는 경우
2) 엔터티별로 데이터의 생명주기(Life Cycle)를 다르게 관리할 경우. 예를 들어, 부모 엔터티가 자식 엔터티보다 먼저 소멸되는 경우 등을 말한다.
3) 여러개의 엔터티가 하나의 엔터티로 통합되어 표현되었는데 각각의 엔터티가 별도의 관계를 가질 때
4) 자식엔터티에 주식별자로 사용하여도 되지만, 자식엔터티에서 별도의 주식별자를 생성하는 것이 더 유리하다고 판단될 때
2-6. 식별자관계와 비식별자관계 모델링
2-6-1. 비식별자관계 선택 프로세스
식별자 관계를 파악하는데에 있어서 중요한 한가지는 비식별자관계를 파악하는 것이다. 비식별자관계를 파악할때에 있어서 다음과 같은 흐름에 따라 선정한다면 합리적으로 비식별자관계를 설정할 수 있다.
2-6-2. 식별자관계와 비식별자관계 비교
항목 |
식별자관계 |
비식별자관계 |
목적 |
강한 연결관계 표현 |
약한 연결관계 표현 |
자식 주식별자 영향 |
자식 주식별자의 구성에 포함됨 |
자식 일반 속성에 포함됨 |
표기법 |
실선 표현 |
점선 표현 |
연결 고려사항 |
- 반드시 부모엔터티 종속 - 자식 주식별자구성에 부모 주식별자포함 필요 - 상속받은 주식별자속성을 타 엔터티에 이전 필요 |
- 약한 종속관계 - 자식 주식별자구성을 독립적으로 구성 - 자식 주식별자구성에 부모 주식별자 부분 필요 - 상속받은 주식별자속성을 타 엔터티에 차단 필요 - 부모쪽의 관계참여가 선택관계 |
Q. 식별자 관련 문제
1. 다음 중 아래에서 엔터티 내에 주식별자를 도출하는 기준을 묶은 것으로 가장 적절한 것은?
가. 해당 업무에서 자주 이용되는 속성을 주식별자로 지정한다.
나. 명칭, 내역 등과 같이 이름으로 기술되는 것들을 주식별자로 지정한다.
다. 복합으로 주식별자를 구성할 경우 너무 많은 속성을 포함하지 않도록 한다.
라. 자주 수정되는 속성을 주식별자로 지정한다.
⑴ 가, 나
⑵ 가, 다
⑶ 다, 라
⑷ 나, 라
2. 다음 중 비식별자 관계로 연결하는 것을 고려해야 하는 경우로 가장 부적절한 것은?
⑴ 부모엔터티에 참조값이 없어도 자식엔터티의 인스턴스가 생성될 수 있는 경우
⑵ 자식쪽 엔터티의 주식별자를 부모엔터티와는 별도로 생성하는 것이 더 유리하다고 판단되는 경우
⑶ 여러 개의 엔터티를 하나로 통합하면서 각각의 엔터티가 갖고 있던 여러 개의 개별 관계가 통합되는 경우
⑷ 부모엔터티의 인스턴스가 자식 엔터티와 같이 소멸되는 경우
추가적으로 궁금한 사항이나 이해가 되지 않는 점은 언제든지 이메일 또는 카카오톡으로 연락주시면 답변드리도록 하겠습니다.