치춘짱베리굿나이스

ERD 본문

ServerSide/Database

ERD

치춘 2022. 9. 27. 02:24

ERD

ERD란?

Entity Relationship Diagram (개체 관계 다이어그램)

데이터베이스 안에서 테이블간의 관계를 설명해주는 다이어그램이라 할 수 있다

간단한 프로젝트에서는 그다지 필요하지 않을 수 있지만, 대규모 프로젝트는 테이블끼리 연결되어 있는 경우가 상당히 많아 설계를 잘 해두지 않으면 나중에 협업할 때 설명과 인수인계가 힘들어지는 대참사가 날 수도 있다고 한다

테이블들이 특이하게 생긴 화살표로 이어져 있는 모습을 하고 있다

Entity

테이블을 구성하는 각 객체의 구성 성분이다

이름은 명사로 지어지며, 저장된 데이터에 관한 추상적이거나 실재적인 개념이 엔터티로 지정된다

말이 좀 어려운데… 테이블 안에 작성될 수 있는 ‘속성을 가질 수 있는 어떠한 개념’ 이라고 생각하면 된다

학교는 학생이라는 엔터티를 갖고, 학생 개개인은 인스턴스로서 이름이나 식별자, 나이 등의 속성을 갖는다

또는, 대학교학과라는 엔터티를 갖고, 각 학과 인스턴스 (전자공학과, 기계공학과, 영어영문학과 등…) 는 교수라는 엔터티를 가질 수 있다

Entity 분류

엔터티는 두 가지 기준으로 분류될 수 있다

유형 / 무형에 따른 분류로는

  • 유형 엔터티 (Tangible Entity)
    • 물리적인 형태가 존재하는 엔터티이다
    • 위의 예시에서는 학생, 교수 등이 실존하는 인물들이므로 유형 엔터티라고 할 수 있다
  • 개념 엔터티 (Conceptual Entity)
    • 물리적인 형태가 없고, 단지 개념만이 존재하는 엔터티이다
    • 위의 예시에서는 학과가 개념적으로 구분되는 ‘조직' 또는 ‘집합' 의 이름이므로 개념 엔터티라 할 수 있다
  • 사건 엔터티 (Event Entity)
    • 업무 수행 과정 중에 발생하는 엔터티로, 발생량이 비교적 많은 엔터티이다
    • 수강신청이나 과제제출 등이 사건 엔터티라고 볼 수 있겠다

발생 시점에 따른 분류로는

  • 기본 엔터티 (Fundamental Entity)
    • 업무 시작 전부터 존재하는 기본적인 정보이며, 다른 엔터티끼리의 관계에 의해 발생하거나 하지 않는다
    • 보통 타 엔터티의 부모 역할을 하게 된다
    • 또한 타 엔터티의 식별자를 상속받지 않으며, 자신만의 고유 식별자를 가지게 된다
    • 학생이나 교수 등이 기본 엔터티라고 할 수 있다
  • 중심 엔터티 (Main Entity)
    • 기본 엔터티로부터 발생하며, 업무에서 중심적인 역할을 맡는다
    • 데이터의 양이 많이 발생하며, 다른 엔터티와의 관계를 통해 많은 행위 엔터티들을 생성한다
    • 수강신청 페이지를 만든다면 수강신청, 과제 제출 페이지를 만든다면 과제제출 등이 중심 엔터티라고 볼 수 있다
  • 행위 엔터티 (Active Entity)
    • 두 개 이상의 부모 엔터티로부터 발생하며, 내용이 자주 바뀌고 데이터 발생량이 많다
    • 수강신청 페이지에서는 수강신청 내역, 과제 제출 페이지에서는 제출한 과제라고 할 수 있겠다

Entity Attribute

엔터티 속성

말 그대로 속성이다

학생의 이름, 학점 등이 엔터티의 속성이라고 할 수 있다

Entity 간의 관계 표현

  • 엔터티는 직사각형으로 그린다
  • 엔터티의 각 속성들은 타원으로 그린다
    • 그 중, 기본 키 (Primary Key) 는 내부 텍스트에 밑줄을 친다
  • 엔터티간의 관계를 표현할 땐 마름모를 쓴다
    • 마름모 안에는 보통 동사가 들어간다
  • 엔터티간, 또는 엔터티와 관계, 엔터티와 속성을 이어줄 때는 실선을 사용한다
  • Weak Entity라 해서 다른 엔터티에 의존적인 엔터티를 따로 표현하기도 한다
    • 이 때는, 각 도형의 테두리 선을 이중으로 그린다
  • Multivalued Attribute는 한 값 이상의 값을 갖는 속성이다
    • 타원의 테두리 선을 이중으로 그려 표현한다

Cardinality

각 엔터티 (또는 테이블) 간의 수적 관계를 보여주는 표현이다

  • 1:1 관계
    • 교수 한 명당 하나의 사무실을 쓸 수 있다 ↔ 하나의 사무실은 한 명의 교수만을 수용가능하다
  • 1:n 관계
    • 교수 한 명당 여러 명의 대학원생을 둘 수 있다 ↔ 대학원생 한 명은 단 한 명의 교수 아래에 속할 수 있다
  • n:n 관계
    • 교수 한 명당 여러 명의 학부생을 가르칠 수 있다 ↔ 학부생 한 명은 여러 교수의 수업을 수강할 수 있다

새발 표기법

Crow’s Foot Annotation

위의 Cardinality를 그림으로 표현하기 위한 표기법이다

테이블들은 단순한 실선으로 연결되지 않고, 양 끝이 특이하게 생긴 (새발처럼 생기거나 특수한 기호가 붙어있는) 선을 이용한다

테이블간의 다이어그램을 그릴 때에는, 보통 새발이 없는 쪽이 새발이 있는 쪽의 PK를 FK로 받는다

새발 표기법은 I/E 표기법바커 표기법 두 종류가 있는데, I/E는 기호를 주로 사용하고, 바커는 실선과 점선을 혼용한다

I/E 표기법

Information Engineering 표기법이라고 한다

Clive 씨와 James 씨가 공동저술로 발표하고, 제임스 씨가 조금 더 정리하고 발전시켜 널리 쓰이게 되었다

대부분의 ERD에서 보편적으로 사용되는 방식이기도 하다

 

세로 막대기 하나는 1을 나타낸다

교수 단 한 명에 대한 관계를 표현한다

 

막대기 두개는 ‘단 하나' 를 의미한다 (One and only one)

교수 단 한 명에게 대학원생 단 한 명만 배정되었다! 서로 단 하나의 row 끼리만 연결된다는 것을 의미한다

이 경우, 양쪽 끝이 모두 막대기 2개로 표현된다

이 대학원생은 다른 교수를 찾을 수도, 후배나 선배를 둘 수도 없다!!!!

 

원형은 0을 나타낸다

교수가 0명 또는 1명일 수 있다

 

새발은 1 초과를 나타낸다

새발과 막대기가 함께 쓰이면, 1을 포함하므로 1 이상을 나타낸다

교수 1명 이상에 대한 관계를 표현한다

 

원형과 새발이 함께 쓰이면, 0 이상을 나타낸다

원형 + 막대기 + 새발의 조합으로 표현될 때도 있다

교수 0명 이상에 대한 관계를 표현한다

 

왼쪽에 기호 4종류, 오른쪽에 기호 4종류가 올 수 있으니 잘 조합해보면 (특수한 경우 제외) 16개의 경우의 수가 나온다

draw.io 에서도 총 16종류의 선을 제공한다

 

위의 이미지에 의하면, 교수 1명당 대학원생 1명 이상을 둘 수 있다

 

I/E 표기법에선 점선도 사용할 수 있다

좌측 엔터티 (또는 테이블) 가 없어도 우측 엔터티가 존재할 수 있다는 의미이다

위의 예시에서는,

  • 첫 번째 연결에 의하면 교수가 없어도 대학원생 엔터티는 존재할 수 있다
  • 두 번째 연결에 의하면 교수 없이는 대학원생 엔터티도 존재할 수 없다

바커 표기법

리차드 바커 씨가 열심히 발전시킨 표기법이라고 한다

 

바커 표기법은 I/E 표기법과 다르게 막대기와 원을 사용하지 않고, 오직 새발과 실선, 점선만을 사용한다

1을 의미하는 막대기 까지는 사용하는 예시도 있다 (예시가 중구난방하다)

 

새발의 의미는 I/E와 동일하며, 실선은 1, 점선은 0 또는 1을 의미한다

다만 실선과 점선의 위치가 조금 헷갈리므로 주의를 요한다

위의 이미지 예시에선 교수가 0명 또는 1명 연결되는 것이 아니라, 교수가 대학원생을 0명 이상 둘 수 있음을 의미한다

 

또한 점선의 끝에는 새발이 올 수 없다

 

이 예시에선 교수 1명당 대학원생 1명이 배정된다

 

교수 1명당 대학원생 0명 또는 1명이 배정된다

여담

테이블은 위의 표기법에서 엔터티들을 테이블로만 바꿔주면 되고, 행동 (마름모꼴) 등은 특별히 묘사하지 않는다

새발 표기법이 꽤 헷갈려서 정리를 시작했는데 의외로 | (1개), O (0개), 새발 (n개) 라는 공식만 알고 있으면 크게 어렵진 않다

SQL 관련 자격증 시험 때문인지 대다수의 한국어 블로그나 자료가 똑같은 문장 전부 토씨 하나 안 틀리고 똑같은 문장으로 적혀 있어서 한국어로는 자료 찾기가 어려웠다

다들 어떤 자료를 레퍼런스로 쓰고 있는 거지?? 뭔가 자격증 관련 교재인 것 같기도 하다


참고자료

https://doorbw.tistory.com/227

https://stackoverflow.com/questions/33781451/crows-feet-one-vs-one-and-only-one

https://sum0725.tistory.com/12

https://mjn5027.tistory.com/43

https://velog.io/@kw78999/DB-바커와-IE-표기법

'ServerSide > Database' 카테고리의 다른 글

ERD 그려보기 with ERDCloud  (0) 2022.09.27
Identifying / Non-Identifying Relationship  (0) 2022.09.27
MySQL (Express와 함께)  (0) 2022.09.14
DBMS  (0) 2022.09.10
SQL 기본 오브 기본 다뤄보기  (0) 2022.09.10
Comments