# ERD (엔티티 관계도)



DB를 설계할 때 정규화로 테이블을 쪼개놓으면 좋다고 했습니다.&#x20;

하지만 테이블을 그런 식으로 100개 만들어놓으면

나중에 테이블 하나를 보고있을 때 이게 어떤 용도의 테이블인지 판단하기 어렵습니다.&#x20;

그래서 <mark style="color:yellow;">**테이블들의**</mark> <mark style="color:yellow;">**관계**</mark>를 도식화해서 그려놓기도 하는데 이걸 엔티티 관계도 (ERD) 라고 부릅니다.&#x20;



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2Fwe5yTLDAtdYjXJ5F1lzi%2F123.png?alt=media&#x26;token=36b55a5e-7ef9-40e8-8769-71215d4112db" alt=""><figcaption></figcaption></figure>



이렇게 생겼습니다.&#x20;

새로운 기능 만들 때 DB설계를 위해 ERD부터 그리라고 요구하는 사람이 있기도 하고&#x20;

JOIN연산같은거 할 때 관계를 한 눈에 파악할 때도 ERD를 찾기도 합니다.&#x20;

아무튼 ERD 그리는 법을 알아봅시다.&#x20;

직접 종이에 그려도 되고 아니면 무료 온라인 ERD 그리기 프로그램들도 많습니다.&#x20;

ERD그리면 DDL 문법으로 바꿔주는 곳들도 있음&#x20;





### **DBeaver에서는 자동으로 그려줌**



실은 테이블들을 직접 만들어뒀다면 ERD 그리는건 쉽습니다.&#x20;

저번 시간에 만들었던 program, teacher 테이블 아무거나 열어서&#x20;

상단에 '엔티티관계도'라는 메뉴를 눌러보십시오.&#x20;

&#x20;

<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FJ3U0KxmAwQMTpZzMbEBP%2FScreenshot_75.png?alt=media&#x26;token=2c66ce3c-4003-4e53-914c-e48c0d8333dc" alt=""><figcaption></figcaption></figure>



그럼 이런 그림이 뜨는데 이게 ERD 입니다.&#x20;

테이블 간에 어떤 관계가 있는지 선으로 알려줍니다.



1\. 일단 네모는 테이블 1개를 의미합니다. 테이블의 모든 컬럼명을 세로로 적어줍니다.&#x20;

2\. 열쇠는 대부분 primary key라는 뜻입니다.&#x20;

3\. 테이블끼리 Foreign key로 연결되어있으면 선으로 이어줍니다.&#x20;

나머지 표기형식에 관한 내용은 링크를 참고합시다.&#x20;

{% embed url="https://dbeaver.com/docs/wiki/Database-Structure-Diagrams/" %}



### **온라인 쇼핑몰 서비스의 ERD를 그려봅시다**



온라인 쇼핑몰을 운영하려고 하는데  ERD부터 그려 봅시다.

검색해보면 온라인 쇼핑몰 ERD 예시들 많은데 그런거 베껴주는게 더 빠르지만&#x20;

우린 직접 그려봅시다.&#x20;



구글에 erd 같은거 검색하면 온라인으로 그려볼 수 있는 사이트 많은데

우린 이런 사이트에서 한 번 만들어봅시다. 가입하고 free plan 고르면 됩니다.

{% embed url="https://www.lucidchart.com/pages/" %}

이외에도 여러 ERD 그릴 수 있는 사이트 들이 있습니다.





Lucidchart 사이트에서 Document 하나 만들면 이제 ERD 그릴 수 있는데&#x20;

왼쪽에 보시면  More Shape 버튼 눌러서 Entity Relationship 버튼 체크해둬야 이쁘게 테이블 그릴 수 있습니다.&#x20;







### **ERD 그리는 법 1. 테이블부터 그립시다**



우선 ERD를 잘 그리고 싶으면 필요한 테이블과 컬럼부터 전부 그려놓으면 됩니다.&#x20;

무슨 테이블이 필요할지 모르겠으면 여러분이 만들고 싶은 쇼핑몰의 **기능들을 쭉 나열해보고**

그걸 구현하기 위해 어떤 데이터들을 + 어떤 테이블에 저장해둘지 정리해두면 됩니다.

물론 정규화해서요.&#x20;

&#x20;

\- 회원가입기능&#x20;

\- 상품주문기능&#x20;

&#x20;

일단 간추려서 이런 기능 2개만 필요하다고 가정해봅시다.

그럼 일단 회원가입을 위해선 **회원아이디, 비번, 이름** 같은걸 테이블에 저장해놔야하고&#x20;

상품을 주문하면 **주문날짜, 주문상품, 주문한사람**을 테이블에 저장해놔야하지 않겠습니까&#x20;

이건 제 생각일 뿐이고 여러분 생각은 다를 수 있으니 알아서 자신있게 합시다.&#x20;

아무튼 결정했으면 그걸 테이블과 컬럼으로 그리십시오. &#x20;



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FH5ThtWKmqTr01NmpydSy%2FScreenshot_79.png?alt=media&#x26;token=70822250-d034-432a-9e57-08ef3e1424d2" alt=""><figcaption></figcaption></figure>



&#x20;컬럼은 세로로 기재하면 됩니다.&#x20;

\- 박스에 우클릭하면 컬럼하나 추가할 수 있습니다.



Primary key 역할 컬럼은 굵게 처리하거나 PK라고 기입하는 경우가 많습니다.



상품을 누가 샀는지 기록하기 위해서

주문내역table에 '회원table의 id컬럼' 도 넣었는데 그런 foreign key 컬럼은 FK라고 기입하는 경우가 많습니다.&#x20;



-편의를 위해 상품은 한 가지만 살 수 있다고 가정합시다.



### **ERD 그리는 법 2. 관련있는 테이블끼리 선으로 잇기**&#x20;



지금 딱 보면 회원table & 주문내역table은 서로 관련이 있죠?

**회원table의 id컬럼**을 주문내역table에서 가져다쓰니까요.&#x20;

그런 식으로 Foreign key로 연결된 테이블들이 있으면 선으로 다 이으면 됩니다.&#x20;

근데 선에 특별한 표시를 하는 경우가 있습니다.&#x20;



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2FnPeY9sOKf0eJyW8ldZa7%2FScreenshot_80.png?alt=media&#x26;token=1725b3c6-30b5-4b53-acf8-a477c7ec70dc" alt=""><figcaption></figcaption></figure>





지금 **회원1명이 -> 주문내역을 최소 몇개 \~ 최대 몇개나** 가질 수 있죠?&#x20;

0개 \~ 무한히 가질 수 있죠?&#x20;

그럼 그걸 선에 표기하면 됩니다.&#x20;

&#x20;

0개를 표현하려면 O

1개를 표현하려면 |

무한히를 표현하려면 Ψ

쓰십시오.&#x20;



그래서 회원1명은 주문내역을 0개부터 무한대만큼 가질 수 있다고 표기해주면 됩니다.

그럼 반대로 **주문내역 1개는 -> 회원을 최소 몇개 \~ 최대 몇개** 가질 수 있죠?&#x20;

그것도 계산해서 위에 표기해주면 됩니다.&#x20;

&#x20;최소1개, 최대 1개로 표시하면 될 것 같습니다.



<figure><img src="https://3814826491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FJyHOwztPxBT3bLpisjCt%2Fuploads%2F7b2d857xQDgJWx75ltfz%2FScreenshot_78.png?alt=media&#x26;token=1b16ed6b-9c1c-4451-890f-fc444e44ae4c" alt=""><figcaption></figcaption></figure>

그래서 이렇게 그려봤습니다.

이게 선 그리는 법입니다. 최소, 최대만 잘 기입하면 됩니다.



(참고)

테이블 관계를 부모/자식 관계에 빗대어 표현하는 경우가 있습니다.

내가 다른 테이블에서 컬럼을 빌려쓰고 있으면 자식테이블,

내가 가진 컬럼을 다른 테이블에 빌려주고 있으면 그 친구는 부모테이블이라고 비유해서 부릅니다.&#x20;

