Mysql&DBeaver

DBeaver) 엔티티 관계도 쉽게 잘그리는 법 (ERD)

연습노트 2024. 9. 8. 23:01

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

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

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

그래서 테이블들의 관계를 도식화해서 그려놓기도 하는데 이걸 엔티티 관계도 (ERD) 라고 부릅니다. 

 

 

 

 

▲ 대충 이렇게 생겼습니다. 

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

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

아무튼 ERD 그리는 법을 알아봅시다. 

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

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

 

 

 

 

 

 

DBeaver에서는 자동으로 그려줌

 

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

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

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

 

 

그럼 이런 그림이 뜨는데 이게 ERD 입니다. 

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

 

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

2. 열쇠는 대부분 primary key라는 뜻입니다. 

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

나머지 표기형식에 관한 내용은 https://dbeaver.com/docs/wiki/Database-Structure-Diagrams/ 여기 참고합시다. 

 

 

 

 

 

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

 

온라인 쇼핑몰을 운영하려고 하는데 팀장이 ERD부터 그리라는 겁니다. 

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

우린 직접 그려봅시다. 

 

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

https://www.lucidchart.com/pages/

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

 

 

 

 

 

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

▲ 왼쪽에 보시면 +Shape 어쩌구 버튼 눌러서 Entity Relationship 버튼 체크해둬야 이쁘게 테이블 그릴 수 있습니다. 

 

 

 

 

 

 

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

 

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

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

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

물론 정규화해서요. 

 

- 회원가입기능 

- 상품주문기능 

 

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

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

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

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

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

 

 

 

 

▲ 그려봤습니다. 컬럼은 세로로 기재하면 됩니다. 

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

 

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

 

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

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

 

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

 

 

 

 

 

ERD 그리는 법 2. 관련있는 테이블끼리 선으로 잇기 

 

 

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

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

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

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

 

 

 

 

테이블 끼리 서로 어떤 관계인지 설명하기 위해 선에 이것저것 표기를 하는데 

표기하는 법은 그냥 절 따라합시다. 

 

 

 

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

0개 ~ 무한히 가질 수 있죠? 

그럼 그걸 선에 표기하면 됩니다. 

 

0개를 표현하려면 O

1개를 표현하려면 |

무한히를 표현하려면 Ψ

쓰십시오. 

 

 

 

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

 

 

 

 

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

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

 

답은 최소1개, 최대 1개 아닙니까 

(주문내역1개에 기재된 회원이 여러명 있을리가 없습니다)

 

 

 

 

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

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

 

 

 

 

 

(참고)

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

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

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

 

현실이랑 비슷한데 

혼자 힘으로 테이블 못만들고 부모에게 컬럼하나 빌려쓰는 놈들이 자식새끼들입니다. 

 

 

 

 

 

 

 

테이블 하나만 더 그려봅시다

 

 

▲ 누가 상품을 2개 이상 구매해버리면 주문내역 테이블에 어떻게 기록하죠?

위처럼 한 칸에 여러 데이터를 넣는건 좀 그렇고 

제1정규화하면될 것 같은데 그러면 복잡해서 다른 테이블로 뺄 수도 있습니다. 

 

 

 

 

 

▲ 주문내역id마다 주문한 상품을 쭉 정리하는 '주문상세' 테이블을 만들고

거기에 주문한 상품들과 수량을 다 보관하는겁니다. 

이렇게 테이블을 설계하는 사람들도 있습니다. 

그럼 주문상세 테이블을 ERD로 그리면 어떻게 그릴 수 있겠습니까 

알아서 그려보시렵니까 

 

 

선생에게 의존하면 안됩니다

 

 

전 이렇게 해봤습니다. 

주문내역 1개는 주문상세를 최소1개, 최대 무한대로 가질 수 있고 

주문상세 1개는 주문내역을 1개만 가질 수 있다고 생각했기 때문에 선도 저렇게 그려보았음 

 

[collapse]

 

 

 

 

 

 

 

 

 

 

ERD 그리는 법 3. 나머지 찌끄레기 

 

- 테이블에 데이터타입과 PK, FK를 표기하는 사람들이 있습니다. 

- 선 양쪽이 Ψ 기호로 연결되어있으면 정규화할 수 있는 여지가 있어서 정규화하는 경우도 있습니다. 

- 선을 점선, 실선으로 구분하는 경우가 있습니다.

identifying relationship 을 가지고 있으면 실선, 그게 아니면 점선으로 표기합니다. 

 

identifying relationship이 뭔데

 

실은 옛날 예적엔 1,2,3 .. 이렇게 1씩 증가하는 숫자컬럼을 PK로 만드는게 아니라

여러 일반 컬럼을 합쳐서 PK로 만드는 경우가 있었습니다. 

자식테이블이 부모테이블에서 컬럼을 꼭 가져와야 PK를 만들 수 있는 경우 identifying relationship 이라고 표현하는데 이 경우 실선으로 표현합니다. 

그게 아니면 non-identifying relationship 이라고 표현하는데 이 경우 점선으로 표현합니다. 

 

그럼 하드용량을 아낄 수 있고 그랬는데 그건 옛날이고

지금은 저장장치 용량이 저렴해져서 대부분 PK를 위한 숫자컬럼을 따로 만들기 때문에 

점선 실선 구분은 크게 중요하진 않습니다. 

 

[collapse]

 

 

 

 

 

 

 

 

오늘의 숙제 : 

 

Q1. 온라인 게시판서비스를 위한 데이터베이스의 ERD를 그려보십시오. 

- 회원가입기능 필요

- 게시글 작성기능 필요

- 추천기능 필요 (게시글마다 어떤 유저들이 추천을 박았는지 기록해둬야함)

무슨 테이블, 무슨 컬럼들이 필요할지는 정확한 답은 없으니 여러분이 알아서 해보십시오

 

안해보고 누르면 뭐함

 

 

회원 테이블 만들고 게시글 테이블 만들어봤습니다.

근데 게시글마다 추천박은 유저를 기록해둬야되는데

그걸 게시글 테이블에 저장하려면 귀찮을거같아서 따로 테이블로 빼봤습니다. 

 

[collapse]

 

 

 

Q2. 댓글기능을 추가하고 싶습니다. 방금 그린 ERD에도 반영해봅시다. 

댓글내용, 발행날짜, 누가작성했는지, 어떤글에속해있는지 등의 컬럼이 필요할듯요 

아무튼 댓글기능 구현에 필요한 내용도 ERD에 반영해봅시다. 

 

 

 

 

게시글마다 댓글이 필요합니다.

근데 게시글테이블에 저장하기엔 좀 많아서 다른 테이블로 정규화해봤습니다.

전 이렇게 했는데 여러분은 다르게 생각할 수 있을듯요