앞에서는 DataBase를 사용하는 방법에 대해서 알아보았다면, 여기서는 DataBase를 어떻게 설계해야 하는지, 즉 DataBase의 Schema를 어떻게 만들지에 대한 생각을 해보는 부분이다.
이를 위해서 Entity-Relationship Model이라는 개념을 도입하게 되는데, 이 E-R Model을 먼저 만들고, 이를 통해 Relational Model을 만들게 된다.
즉, E-R Model이 무엇인지배우고, 이를통해 E-R Diagram을 만들고, 이 E-R Diagram으로부터 Relational Model을 만드는 방법을 살펴볼 것이다.
E-R Model은 다음과 같이 DataBase를 Entity와 Relationship으로 나누어 생각하는 방법이다.
이 때, DataBase를 설계하는 단계이기 때문에 앞에서 배웠던 Relational DataBase의 속성과는 다른 점이 있을 수 있다.
(예를들어 E-R Model에서는 Atomic하지 않은 Data도 허용한다.)
따라서 일단 우선은 E-R Model이 Relational DataBase와 다르다는 것을 인지하고, 이 E-R Model이 어떻게 Relational DataBase로 변해가는지에 초점을 맞추어야 할 것 같다.
Entity는 위의 데이터를 실체화한 대상이다. 즉, Data에 실제로 들어가는 값들이라고 생각할 수 있다.
Attribute
모든 Entity들은 Attribute를 가진다.예를들어 위의 예시에서 Einstein이라는 교수가 있다고 해보자. 이 때
Einstein
이라는 Entity는ID
,name
,salary
라는 Attribute를 가진다는 것이다.
Entity Set은 Entity들이 모여있는 집합을 의미한다.
즉 이 Entity Set은 후에 몇가지 과정을 거쳐 테이블이되고, Entities는 이 Table의 Tuple이 된다.
Key
Relational Model과 마찬가지로 E-R Model의 EntitySet도 Key를 가진다.
(Primary Key, Candidate Key, Super Key)
앞에서 잠깐 이야기 했듯이 모든 Entity들은 Attribute를 가진다.
Relational Model과 마찬가지로 이 Attribute는 Domain을 가지는데 이는 다음과 같이 나누어 볼 수 있다.
(varchar
,int
와 같이 구체적인 값이 아니라 추상적인 개념으로 접근해보자.)
Attribute의 Domain
- Simple & Composite
- Simple
: 단일 값만을 갖는 데이터를 의미한다.- Composite
: 여러 데이터가 구조를 이루어 하나의 데이터를 형성하고 있음을 의미한다.
(ex. name은 firstname과 lastname으로 이루어져있다.)
(ex. Address는 Street, City, State로 이루어져 있다.)
- Single-Valued & Multi-Valued
- Single-Valued
: 단일 값만을 갖는 데이터를 의미한다.- Multi-Valued
: 여러개의 데이터를 한번에 입력할 수 있는 Domain을 의미한다.
(ex. 한명이 여러개의 Phone number를 가질 수 있다.)
- Derived
: 다른 Attribute를 통해 유추할 수 있는 데이터를 의미한다
(ex. age라는 Attribute는 birth라는 Attribute로 부터 추측이 가능하다.)
후에 Relational Model에서는 Simple하고 Single-Valued인 데이터만 남게된다.
Relationship은 Entity들이 관계를 맺고 있다는 것을 의미한다.
흔히 착각할 수 있는 점 중 하나는 Relation을 하나의 현상이라고 이해하면 안되고, 하나의 Data라고 생각해야한다.
Attribute
Relationship도 하나의 Data이기 때문에 Attribute를 가진다.
이 때, 이 Attribute는 우선 관계를 형성한 두 Entity의 Attribute가 포함될 수 있고, 이 외에도 관계를 표현하는 추가적인 Attribute가 있을 수 있다.예를들어, 위의 Crick라는 교수와 Tanaka라는 학생의 관계는
Instructor.name
,Student.name
,Intimacy
등으로 표현할 수 있을 것이다.
Relationship들이 모여있는 집합을 의미한다.
이 때, 이 Relationship Set가 어떻게 형성되었는지에 따라서 degree와 Cardinality라는 속성이 결정된다.
뒤의 RelationShip의 특성을 본 후에 이부분을 보도록 하자.
Primary Key
EntitySet과 마찬가지로 RelationshipSet도 하나의 Data Set이므로 Key를 가진다. 이때, Relationship은 참여하고 있는 두 Entity들로만 Identify될 수 있을 것임을 명심하자.
(즉, 관계를 설명하기 위한 추가적인 Attribute를 위해 Relationship을 만드는 것이 아니다.)이때 이 Primary Key를 정하는 방법은 다음과 같다.
- One to One
: One to One Relationship은 한쪽의 한 Entity만 있더라도 Relationship을 정의할 수 있었다.
- 즉, 두 EntitySet의 PrimaryKey중 하나의 PrimaryKey로 선택한다.
- Many to One
: Many to Many Relationship은 Many쪽의 Entity가 있어야 Relationship을 정의할 수 있었다.
- 즉, Many를 담당하는 EntitySet의 PrimaryKey를 PrimaryKey로 선택한다.
- Many to Many
: Many to Many Relationship은 양쪽 모두의 Entity가 있어야 Relationship을 정의할 수 있었다.
- 즉, 두 EntitySet의 PrimaryKey를 조합해 primarykey로 정한다
1. Relationship Set의 Degree
![]()
2. Relationship Set의 Cardinality
![]()
3. Relationship Set의 Participation
![]()
4. Strong EntitySet과 Weak EntitySet
E-R Model에는 중복된 Attribute가 각 Entity에 존재하면 안된다는 규칙이 있다. 즉, 다음과 같이 중복된 Attribute가 있을 경우 한쪽을 지워주고, 이를 Relation으로 표현해야 한다.
![]()
이 때, 위의 경우에서는 겹치는 Attribute가 지워지는 쪽에서 Primary key를 구성하지 않았으므로 문제가 되진 않는다.
하지만, 만약 그렇지 않다면, 한 EntitySet에 의해 다른 EntitySet이 결정되는 관계가 되어버린다.
이렇게, 다른 EntitySet에 의존하는 EntitySet을 Weak EntitySet이라고 하고 그렇지 않으면 Strong EntitySet이라고 한다.
![]()
이 때, Weak EntitySet의 PrimaryKey는 더이상 제역할을 하지 못한다. 즉, 해당하는 Strong Entity Set의 PrimaryKey와 합쳐져야 PrimaryKey의 역할을 할 수 있다.
이 Weak EntitySet의 PrimaryKey를 PartialKey혹은 discriminator라고 한다.
![]()
여태껏 봐왔듯이 Entity Set은 사각형으로 표시하고, 그 안에 Attribute를 표시한다.
![]()
마찬가지로 여태껏 봐왔듯 Relationship Set은 마름모로 표시하고 이 Relationship에 참여하는 EntitySet을 연결하도록 한다.
![]()
Relationship에 참여하는 EntitySet의 Entity들 이외에 Relationship을 설명하는 추가적인 Attribute가 있을 수 있다. 이것은 점선과 사각형을 통해 표현해준다.
![]()
Cardinality는 화살표로 표현한다. 이 때, 화살표의 시작점의 Entity가 결정되면 화살표의 도착점의 Entity가 결정된다는 것으로 해석할 수 있다.
(One쪽에 화살표의 머리가 존재)
Ternary Relationship의 Cardinality
세개 이상의 Ternary Relationship에서는 화살표를 하나만 사용해 표현할 수 있다.
이 이유는 화살표가 2개 이상이 들어갈 경우 해석하는데에 모호성이 생기기 때문이다.
(예시)
![]()
해석1
: Student가 결정되면 project와 instructor가 결정된다.
해석2
: Student와 Project가 결정되면 Instructor가 결정되고, Student와 Instructor가 결정되면 Project가 결정된다.
1. Total Participation
![]()
위와같이 Total Participation은 겹친 선으로 표현한다.
2. Partial Participation
![]()
위와 같이 Partial Participation은 하나의 선으로 표현한다.
1. Strong Entity Set
![]()
위와 같이 우리가 지금까지 봐왔던 EntitySet은 StrongEntitySet이었다.
2. Weak Entity Set
![]()
위와 같이 Weak EntitySet은 겹친 사각형으로 표현한다.
또한, 그 PartialKey는 점선으로 표현한다.
이제 위에서 만든 ER-Diagram을 통해 Relational Schema를 만드는 방법을 알아보자.
(참고)
Relational Schema는 Section(couse_id, sec_id, semester, year)와 같이 표현하는 것을 의미한다.
우선 EntitySet에 Composite나 Multi-Valued Attribute가 있을 경우, 다음과 같은 작업이 필요하다.
- Composite Attribute가 있을 경우
: Flattened, 즉 구조를 이루던 값을 각각 모두 넣거나 합쳐서 넣어주어야 한다.
- Multi-Valued Attribute가 있을 경우
: 두 개의 Entity Set으로 만들어 준다.
Multi-Valued Attribute일 때 나누어진 EntitySet의 Primary는 나눈 기준과 나누어진 Column 모두로 PrimaryKey를 구성해야한다.
![]()
Strong Entity Set의 경우 그냥 그대로 Relational Schema로 바꾼다
Instructor(ID, dept_name, salary, phone_number_id)
![]()
Weak Entity Set의 경우 해당 Set을 연결하는 Strong Entity Set의 Primarykey와 합쳐서 표현한다.
Section(course_id, sec_id, semesterm, year)
![]()
먼저 Weak EntitySet을 포함하는 경우의 RelationShip은 따로 Relation을 만들지 않는다.
Sec_course는 Relation을 만들지 않는다.
이 경우는 항상 Table을 새로 만들고 Primary key는 Relationship을 갖는 두 Attribute로 정한다. *(이 때, Extra Attribute가 있을 경우 추가해 주는 것을 잊지말자.)*
teaches(ID, course_id, sec_id, semester, year)
(양 EntitySet를 통해 만든 Table의 Primary key를 가져오고, 추가할것이 있으면 추가하도록 하자)
(참고로 여기서는 Section을 Table로 만들었을 때, course_id가 포함되었다.)
![]()
위와 같이 Total Participation이 포함된 경우 새로운 Table을 만들지 않고, Many에 해당하는 Entity Set에 One에 해당하는 Primary Key를 추가해주기만 하면 된다.
(One to One의 경우는 아무거나 1개)
Inst_dept는 Relation을 만들지 않는다.
마찬가지 방법으로 새로운 Table을 만들게 된다.