> [!abstract] introduction > 데이터베이스는 현실 세계에서 일어나는 여러가지 상호작용을 논리적으로 나타냅니다. 그 설계를 위하여 여러 데이터 모델이 고안되었고, E-R 모델*Entity-Relationship Model*은 설계 과정에서 사용되는 대표적인 데이터 모델입니다. 이번 글에서는 이 E-R 모델에 대해 알아봅니다. # Entity, Attribute, Relationship 데이터베이스를 설계하기 위해서는 여러 단계가 필요한데, 그 중 첫번째 단계는 실제 세계의 상호작용을 추상적인 데이터 모델로 표현하는 개념적 스키마*Conceptual Schema* 단계이다. 이 단계에서 주로 사용하는 것이 바로 E-R 모델*Entity-Relationship Model*이다. 이 모델에서 사용하는 기본 요소는 크게 세가지로 각각 개체 집합*Entity Set*, 속성*Attribute*, 그리고 관계 집합*Relationship Set*이다. ## Relationship 현실에서는 사람, 사물, 개념 등 여러 객체 사이에 어떤 관계가 있을 수 있다. 대학원생에게는 지도교수가 있으며, 이는 대학원생과 교수 간의 관계라고 볼 수 있다. 또한 회사와 사원 사이에는 고용관계가 성립한다. 이러한 현실의 관계는 데이터베이스에서도 똑같이 존재한다. 데이터베이스의 관계*Relationship*은 여러 객체 사이의 관계로 정의되며, 동일한 유형의 관계를 모은 집합을 관계 집합*Relationship Set*이라 부른다. 그리고 특정 시점의 데이터베이스를 데이터베이스 인스턴스라 부르듯이 특정 시점의 관계 집합은 관계 인스턴스*Relationship Instance*라 부른다. ![[RelationshipInstance.png]] 조금 더 엄밀한 정의는 이렇다. - $n$개의 개체 집합 $E_1, E_2, ..., E_n$에 대하여 $(e_1, e_2, ..., e_n)$을 관계 인스턴스라 부르자. 그러면 어떤 관계 집합 $R$은 집합 $\{(e_1, e_2, ..., e_n)|e_1 \in E_1, e_2 \in E_2, ... e_n \in E_n\}$의 부분집합으로 정의된다. - 개체 집합들 간의 상호작용은 참여*Participation*라고 부르며, 개체 집합 $E_1, E_2, ..., E_n$은 관계 집합 $R$에 참여한다. ### Role 어떤 개체가 관계에서 맡는 기능은 그 개체의 역할*role*이라 부르는데, 관계에 참여하고 있는 개체 집합들은 서로 분명하게 구분되는 것이 일반적이기에 일반적으로 각 개체 집합의 역할을 명시하지는 않지만, 개체 집합 간의 구분이 명확히 되지 않을 때는 이러한 구분이 필요하다. ![[OneSetRelation.png]] 위와 같이 하나의 개체 집합만 관계에 참여하는 재귀적 관계 집합*Recursive Relationship Set*가 대표적인 예시다. 선수*先修*과목과 같은 관계는 과목이라는 개체 집합만 참여하는 관계라 이를 나타내기 위해 역할 표시자*Role Indicator*를 추가로 표시하기도 한다. ### Degree of The Relationship Set ![[TenaryRelationship.png]] 관계 집합에 참여하는 개체 집합의 수를 관계 집합의 차수*Degree of The Relationship Set*이라 부른다. 예를 들어 관계 집합에 관련된 개체 집합이 두 개인 이진 관계 집합*Binary Relationship Set*의 차수는 2고 세 개의 개체 집합이 얽혀있는 삼진 관계 집합*Ternary Relationship Set*의 차수는 3이다. ## Entity Set & Attribute 개체*Entity*는 실제 세계의 사람이나 사물에 해당하는 개념으로, '사람'이나 '비행기', 혹은 '건물'이나 '강좌'처럼 어떤 범주에 대응한다. 이런 개체들은 여러가지 속성*Attribute*을 가지는데, 가령 '강좌'라는 개체들은 학생 수, 강의 시간, 담당 교수 등 강좌에 대한 여러 정보를 가지고 있는데, 이 정보들이 각각 하나의 속성이 된다. 이처럼 동일한 종류의 속성을 가지고 있는 개체들의 집합을 개체 집합*Entity Set*이라 부르고, 실제로 속성이 같은 개체들이 모인 집합을 부를 때는 개체 집합의 확장*Extension of The Entity Set*이라 부른다. ![[EntitySet.png]] ### Value 하나의 속성에는 하나의 값*Value*이 대응한다. 학생에게는 학번이 있을 것이고 그 학번은 학생마다 다를 텐데, 이를 데이터베이스 상에서 구현한다면 학번 자체는 학생이라는 개체의 속성이 될 것이고 각 학생의 실제 학번은 속성에 대응하는 값이 될 것이다. ### Descriptive Attribute 기본적으로 관계의 속성은 그 관계에 참여하고 있는 개체들의 속성으로 이루어져 있지만, 그 외에도 설명 속성*Descriptive Attribute*이라는 속성이 추가로 존재할 수 있다. ![[DescriptiveAttribute.png]] 이 속성은 그 어떤 개체 집합에도 포함되지 않고 오직 특정 관계 집합에서만 존재하는 속성이며, 다이어그램 상에서는 나뉘지 않은 사각형으로 표시되며 관계 집합과 점선으로 연결되어 있다. 예를 들어 관계 집합 *takes*에는 설명 속성 *grade*가 있다. ### Domain / Value Set 각 속성이 가질 수 있는 값에는 일정한 범위가 있는데, 이것을 도메인*Domain* 혹은 값 집합*Value Set*이라 부른다. 이 범위는 일정한 길이의 문자열이 될 수도 있고, 어떤 주제를 가리키는 단어들의 집합이 될 수도 있다. ### Composite Attribute ![[CompositeAttributes.png]] 속성이라고 해서 무조건 분리가 불가능한 것은 아니다. 속성은 단순하기도*Simple* 하지만, 여러가지 속성으로 나눌*Composite* 수도 있다. ### Multivalued Attribute 학생마다 하나씩만 있는 학번처럼 하나의 개체에 대하여 하나의 값을 가지는 속성을 Single-valued Attribute라고 부른다. 하지만 그와 반대로 전화번호 같은 속성의 경우 어떤 사람은 전화번호가 여러 개일 수도 있고, 어떤 사람은 번호가 한 개밖에 없을 수도 있다. 이런 속성은 값이 여러 개라 Multivalued Attribute라고 부른다. ### Derived Attribute 속성의 값이 다른 속성이나 개체에서 파생된 경우도 있다. 이런 경우 해당 속성을 파생된 속성*Derived Attribute*이라 부르며 이런 속성의 값은 저장되지 않지만 필요할 때 다른 속성을 통해 계산할 수 있어야 한다. 예를 들어, 강사라는 개체 집합에 강사가 가르친 학생 수인 `students_advised`라는 속성이 있다고 가정해보자. 그러면 이 속성을 계산하기 위해서는 해당 개체와 연관된 학생 개체의 수가 얼마나 되는지를 세면 된다. ### Null 속성은 Null 값을 가질 수도 있는데, 이는 어떤 개체가 어떤 속성을 가지고 있지만, 그 속성의 값을 가지고 있지 않다는 것을 의미한다. 이는 여러가지 의미가 있다. 널 값은 개체 안에 해당 속성의 값이 존재하지 않는다는 것을 의미할 수도 있고, 해당 속성의 값이 파악되지 않는다는 의미일 수도 있다. 이 경우, 개체는 속성에 대한 값을 분명 가지고 있지만 그 값이 무엇인지 알 수가 없는 상황이거나 속성에 대한 값을 가지고 있는지조차 불투명한 상황이다. --- # 출처 - Silberschatz, A., Korth, H.F. and Sudarshan, S. (2020) _Database system concepts_. Seventh edition. New York, NY: McGraw-Hill.