치춘짱베리굿나이스
ERD 본문
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
'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 |