[데이터베이스] E-R 다이어그램(E-R Diagram)

Designing Database

데이터베이스를 설계하는 과정은 몇가지 과정으로 나뉘어진다.

  1. Data need 파악
  2. Data Model 선택 > Conceptual Schema 파악 > functional requirement 고민
  3. Database 구현

    • Logical Design: security, CS, business
    • Physocal Design: physical layout

RDBMS 설계 원칙

  1. Redundancy: 데이터가 중복되어 있으면 안된다. 똑같은 값이 여러군데에 들어있다면 업데이트할 때 모든 부분을 다 찾아서 업데이트해야되는 상황이 발생한다. 잘못되면 같은 데이터인데 값이 다 다르게 될 수도 있다. 이런 문제를 data inconsustency라고 한다.
  2. Incompleteness: 우리가 데이터베이스로 표현하려고 하는 것들이 완벽하게 표현이 가능한지 아는 것이 중요하다.

E-R Diagram(Entity-Relation Diagram)

데이터베이스 스키마를 표현하는 방법으로 우리는 쿼리를 계속 사용했지만, 시각적으로 표현하는 것도 가능하다.

Entity Sets

Entity는 데이터를 표현하는 것이다. 데이터베이스에서 우리가 나타내는 tuple이 entity에 속한다.

Entity Set 은 결국 record의 집합이기 때문에 table이나 tuple의 집합을 Entity Set 이라고 말 할 수 있다.

그림으로 entity set은 다음과 같이 표현한다. 그림안에 밑줄이 그어져 있으면 Primary Key의 표현이라는 것도 기억하자.

Relationship Sets

Relation은 Entity 사이에 어떤 관계가 있는지 표현하는 것이다.

Relation Set은 두 개 이상의 Entity들 사이에서 어떤 relationship 성립하는지 나타내는 것이다.

위 그림에서 중간에 나타나는 advisor와 date가 양쪽 entity set에 대한 relation이다. 추가적인 attribute 도 relationship에 추가할 수 있는데, 위 예시에서는 date 가 attribute로 추가된 경우이다.

Composite Attribute

여러개의 attribute가 합쳐져서 하나의 attribute를 이루는 경우를 Composite attribute 라고 한다.

위처럼 복합적으로 구성되어 있는 attribute를 ER 다이어그램에 표기할 때는 아래 그림 처럼 indentation으로 구분하여 표기 한다.

Mapping Cardinality Constraints

사실 entity 나 relationship이 중요한게 아니라 둘 사이의 관계가 어떤 형태로 이루어져 있는지 아는 것이 더 중요하다.

두 Entity Set의 관계는 relationship이 최소 몇개에 대해 이루어질 수 있는지에 따라 달라진다. 우리는 어떤 Entity set 이 항상 하나의 대응되는 relationship을 가질 때, 화살표로 표기하고, 여러개의 relationship을 가질 수 있다면 일반 직선으로 표기한다.

기억해야 할 부분은 many 유형은 0 이상이기 때문에 꼭 어떤 relationship을 가지지 않아도 된다는 것이다.

이런 관계는 총 네 가지 유형으로 나눌 수 있는데 하나씩 살펴보자.

one to one

one to one 관계는 두 entity set 이 서로 하나의 relationship으로만 연결될 수 있는 relationship을 말한다. 그리고 아래와 같이 표현한다.

relationship owns 에 대해 customer 와 Account가 one-to-one 관계를 가진다. 즉, 위 예시에서는 한 명의 고객이 하나의 계정만을 가질 수 있는 것을 의미한다.

many to one

many to one 하나의 entity set이 여러 다른 entity에 연결될 수 있고 다른 하나는 하나에만 연결될 수 있는 구조이다.

위 예시는 many to one 관계를 보여준다. owns 관계에 대해 Customer는 다수가 연결되고 Acoount 는 하나만 연결된다. 즉, 다수의 고객이 하나의 계정을 공유할 수 있다는 것을 표현한다.

one to many

many to one 을 단순하게 뒤집은 구조이다. 아래 예시를 보자.

Customer는 owns relationship에 대해 하나만 연결되고, Account는 여러개가 연결될 수 있다. 즉, 한명의 고객이 여러 계정을 가질 수 있다. 하지만 기억해야 할 점은 한 계정은 공유되는 것이 아니라 하나의 고객에게만 연결되어 있다는 것이다.

many-to-many relationship

many to many 관계는 양 쪽의 entity set이 서로 다수의 relationship을 가질 수 있는 구조이다.

위 예시를 보면, 한명의 고객이 여러 계정을 가질 수 있고, 해당 계정 역시 다수에 의해 공유될 수 있는 상태를 표현한 것이다.

Total and Partial Participation

Total particiation은 entity set의 모든 entity가 적어도 하나 이상의 relationship을 가지고 있는 것을 의미한다. 그리고 이것을 그림에서 표기하기 위해서 두개의 선으로 이루어진 선을 사용한다.

Partial particiation은 entity set 의 entity가 꼭 모두 relationship을 만들지 않아도 된다는 것을 의미한다.

위 그림에서 두줄로 연결되어 있는 부분이 total participation이다. 따라서, borrower relationship에 대해서 모든 loan 의 entity가 적어도 하나 이상의 customer의 entity와 연결되어 있어야 한다. customer는 일반 직선으로 borrower relationship을 만들기 때문에 many, 즉 0개 이상의 entity가 loan entity와 연결되어지면 된다.

Notation for Expressing More Complex Constraints

위 예시를 보자, 지금까지 소개했던 e-r diagram은 선의 종류를 통해서 constraint 를 표현했는데, 위와 같이 min, max 값을 직접 지정해주는 것도 가능하다. relationship에 연결되는 선의 위에 표시된 왼쪽 숫자가 최소값, 오른쪽 숫자가 최대값이 된다.

위 사진을 보면 Employee entity set은 manages relationship에 대해서 최소 0개, 최대 1개의 entity가 department 와 연결될 수 있다. 그리고 department 는 최소 1개, 최대 1개의 relationship을 가져야하기 때문에 결국 total participation을 표현한 것이나 다름 없다. max에 사용되는 값은 어떤 값이든지 올 수 있지만, 최대값을 지정해주지 않고 아무값이나 받아도 상관없을 경우에는 ’*’ 표기를 사용하면 된다.

Primary Keys

E-R Diagram의 관점에서 Primary Key는 entity와 relation을 구분하는 도구로 사용된다고 할 수 있다.

Primary Key for Entity Sets

Entity Set 에서 Primary Key는 entity set에서 entity들을 구분할 수 있게 해주는 set of attribute이다. 왜냐하면 각 entity는 attribute로 만들어져 있고, entity set 안에서는 attribute가 동일한 entity가 여러개 존재할 수 없다. 따라서 attibute에 따라서 고유한 entity가 표현되는 것이다.

Primary Key for Relationship Sets

relationship을 표현할 때, 기본적으로 entity set은 두 개 이상이 사용된다. 만약 두 개의 entity set이 존재하고 둘 사이의 relationship을 만들 때, 각 entity set 의 key 중에 어떤 것을 선택해야 할까?

단순하게 두 entity set의 key를 union한 것을 key로 만들어 주면 된다. 하지만 이런 방법이 항상 효율적이지는 않는다. 다음 유형에 따라서 다른 방법을 사용하자.

  1. Many-to-Many : 두 Primary Key의 union을 relationship의 key로 만든다.
  2. One-to-Many : Many 쪽 Entity Set의 Primary Key를 relationship의 key로 만든다.
  3. One-to-One : 어느 쪽의 Primary Key이든 하나만 가져와서 사용한다.

Weak Entity Set

Weak Entity Set은 다른 어떤 Entity에 의존적으로 존재하는 Entity 를 말한다. 그리고 이 Entity 가 의존하게 되는 Entity를 Identifying Entity 라고 한다.

예를 들어 course 라는 entity set 과 section이라는 entity set이 있고, setcourse 라는 relationship이 있다고 할 때, section entity set은 course entity set의 정보가 반드시 필요해진다. 왜냐하면, section으 정보를 얻으려면 결국 courseid가 무엇인지 알아야 정보를 얻을 수 있기 때문이다.

이런식으로 어떤 relationship에 대해서 데이터를 얻기 위해 반드시 있어야 하는 entity set을 identifying entity 라고 한다. Weak entity set의 모든 entity를 구분할 수 있게 하는 attribute들을 discriminator(parial key)라고 부른다.

이런 identifying entity가 모여있는 상태를 identify entity set 이라고 하고, identifying entity set 은 항상 Primary Key를 가지게 된다.

위 그림에서 표현된 것 같이 Weak Entity Set은 두겹으로 박스를 만들어서 표현하고 Identifying relationship 역시 두겹으로 마름모를 만들어서 표현한다. 그리고 Weak Entity Set의 discriminator는 점선 밑줄로 표기한다.


전여훈
Written by@전여훈 (Click Me!)
고민이 담긴 코드를 만들자, 고민하기 위해 공부하자.