열어분 제가 지난번에 모라그랬죠?
DB를 설계할때 정규화로 테이블을 쪼개면 좋다고했죠
하지만 테이블을 그런식으로 100개를 쪼개놓는다면?
나중에 테이블 하나를 보고 있을때 이게 먼 테이블인가 판단하기 어질어질합니다. 그래서 테이블들의 관계를 도식화해서 그려놓기도 하는데요.
이것을 안티티티티 프레자일이 아니라 엔티티 관계도(ERD : Entity Relationship Diagram)이라고 합니다.
⬆️ 요로콤 생겼습니다.
새로운 기능을 추가하기위해 DB 설계를 위해 ERD부터 그리라고 요구하는 사람이 있기도하고, join 연산 같은거 할때 테이블간의 관계를 파악할때 ERD로 찾기도 합니다.
저희는 ERD를 직접 사용해보는 법을 알아보겠습니다.
ERD 는 직접 종이에 그려도 되고요 무료로 온라인에서 ERD를 지원해주는 프로그램도 많습니다. 심지어 ERD 그리면 DDL 문법으로 바꿔주는 곳도 있음;;
그 중 저희에게 DBeaver형님으로 ERD를 그려보겠습니다.
레츠
기 릿
DBeaver에서는 자동으로 ERD 그려줌
실은 테이블들을 직접 만들어놨으면 ERD 그리는 것은 누워서 떡먹기입니다.(누워서 떡먹으면 체하는데…)
저번 시간에 만들었던 program, teacher 테이블 아무거나 열어서 상단에 ‘엔티티관계도’라는 메뉴를 눌러봅시다.
이런그림이 뜨는데요. 이게 ERD입니다.
테이블 간에 어떤 관계가 있는지 선으로 알려줍니다.
- 일단 사각형은 한개의 테이블을 의미합니다. 테이블의 모든 컬럼명을 세로로 적어줍니다.
- 열쇠는 대부분 Primary key라는 뜻입니다.
- 테이블끼리 fk로 연결되어 있음녀 선으로 이어줍니다.
나머지 표기법은 귀찮기때문에
이것을 참고해주십셔.
온라인 쇼핑몰 서비스의 ERD (참고사항)
온라인 쇼핑몰을 오픈하려고합니다. 샤넬처럼 오픈런 하는 온라인 쇼핑몰을 만드려면 ERD는 필수이겠지요?
Intelligent Diagramming | Lucidchart
범용적으로 많이쓰이는 루시드 차트를 이용해봅시다. 가입하고 free plan 고고싱
ERD 비기 제1장. 테이블부터 그리기 이야아아아
우선 ERD를 잘그리고 싶으면 필요한 테이블과 컬럼부터 전부 그려줍니다. 무슨 테이블이 필요할지 모르겠다면 님들이 만들고 싶은 쇼핑몰의 기능을 쭉 나열해보고 그걸 구현하려면 어떤 데이터 + 어떤 테이블에 저장해둘지 정리해줍니다.
물론 정규화 해서염
- 회원가입기능
- 상품주문기능
일단 간추리고 간추려서 최소 2두개는 필요하다 가정해봅시다.
그럼 일단 회원 가입을 위해서는 회원아이디, 비번, 이름 이런걸 테이블에 저장해놔야하고요.
상품을 주문한다면 주문날짜, 주문상품, 주문한사람을 테이블에 저장해놔야겠지요??
여러분들은 입맛대로 생각해서 나열하시면 됩니당
아무튼 결정했으니 그걸 테이블과 컬럼으로 그리겠습니다.
⬆️ 컬럼을 세로로 써줍니다.
- 박스에 우클릭하면 컬럼하나 추가할 수 있습니다.
- primary key 역할 컬럼은 굵게처리하거나 PK라고 기입하는 경우가 많습니다.
- 상품을 누가 샀는지 기록하기 위해 주문내역table에 ‘회원table의id컬럼’ 도 넣었는데 그런 foreign key 컬럼은 FK라고 기입하는 경우가 많습니다.
- 편의를 위해 상품은 1개만 살 수 있다고 가정합니다.
ERD 비기 제2장. 관련있는 테이블끼리 선으로 긋기
지금 딱보면 회원 테이블과 주문내역테이블이 서로 관련있어보이고 막 그렇지 않습니까? **회원table의 id컬럼(회원id)**을 주문내역table에서 가져다쓰니까 그렇습니다.
그런식으로 Foreign key로 연결된 테이블들이 있으면 선으로 냅다 찍찍그어줍니다.
근데 선에 특별한 표시를 하는 경우가 있는데여
테이블끼리 서로 어떤 관계인지 설명하기 위해 선에 이것저것 표시를 해주는데 표기하는 법은 그냥 한번 배워봅시다.
지금 회원1명이 → 주문내역을 최소 몇개 ~ 최대 몇개 가질 수 있죠?
0~무한이잖습니까?
그걸 선에 표시합니다.
0개 표현 → 0
1개 표현 → |
무한히를 표현 → Ψ
갈겨줍니다.
⬆️ 그래서 저희가 0~무한 이니까 일케 표기해줍니다.
그럼 반대로 주문내역 1개는 → 회원을 최소 몇개 ~ 최대 몇개 가질 수 있을까요? 그것도 계산해서 위에 표기해주면 됩니다.
답은 최소 1개, 최대 1개입니다.(주문내역 1개인데 여러명의 회원이 주문했을리가 없습니다.)
⬆️ 그래서 일케 그리는 것입니다.
이것이 ERD에서 선을 그리는 비기입니다. 최소, 최소 이것만 기억을 잘해서 기입하면 됩니다.
(참고)
테이블 관계를 부모/자식 관계에 빗대어 표현하는 경우가 있습니다.
내가 다른 테이블에서 컬럼을 빌려쓰고 있다면 자식
내가 가진 컬럼을 다른 테이블에 빌려주고 있다면 그친구는 부모테이블입니다.
현실이랑 비슷한데요.
혼자힘으로 테이블을 못만들고 부모에게 캥거루족 컬럼하나 빌려쓰는 놈들이 자식입니다…..
묻고 테이블하나더로 가
⬆️ 누가 상품을 2개이상 구매해버리면 주문내역 테이블에 어떻게 기록할까요?
위처럼 한칸에 여러개 데이터를 넣는 것은 좀 그렇고
지금까지 제 글을 정독하신 분들은 제1정규화 갈기면 되는거아니야? 하실테지만 그러면 좀 복잡해져서요…
다른 테이블로 뺄 수 있습니다.
⬆️ 주문내역id마다 주문한 상품을 관리하는 ‘주문상세’테이블을 따로 만들고 거기에 주문한 상품들과 수량을 다 보관해줍니다.
이렇게 테이블을 설계하는 사람들도 있습니다.
그럼 주문상세 테이블을 ERD로 그려볼까여?
저는 한번 일케 만들어봤음요.
주문내역 1개는 주문상세를 1 ~ 무한으로 가질 수 있고
주문 상세 1개는 주문내역을 1개만 가질 수 있다고 생각하기때문에 선도 저렇게 그려보았슴다.
ERD 비기 제3장. 나머지정리… 이야아아아
- 아예 테이블과 데이터 타입과 PK, FK를 표기하는 사람이있습니다.
- 선 양쪽이 Ψ 기호로 연결되어있으면 정규화할 여지가 있어 정규화해줄 수도 있습니다.
- 선을 점선, 실선으로 구분하는 경우도 있습니다.
(identifying relationship 을 가지고 있으면 실선, 그게 아니면 점선으로 표기합니다.)
- identifying relationship?여러 일반 컬럼을 합쳐서 PK로 만드는 경우가 있었습니다.그게 아니면 non-identifying relationship 이라고 표현하는데 이 경우 점선으로 표현합니다.지금은 저장장치 용량이 저렴해져서 대부분 PK를 위한 숫자컬럼을 따로 만들기 때문에
- 점선 실선 구분은 크게 중요하진 않습니다.
- 그럼 하드용량을 아낄 수 있고 그랬는데 그건 옛날이고
- 자식테이블이 부모테이블에서 컬럼을 꼭 가져와야 PK를 만들 수 있는 경우 identifying relationship 이라고 표현하는데 이 경우 실선으로 표현합니다.
- 실은 옛날 예적엔 1,2,3 .. 이렇게 1씩 증가하는 숫자컬럼을 PK로 만드는게 아니라
오늘도 긴 글 읽어주셔서 감사합니다. 수고하셨습니다.
'DI(Digital Innovation) > DataBase & SQL 뽀개기' 카테고리의 다른 글
LEFT AND RIGHT(feat. jungkook of BTS) JOIN (1) | 2024.03.14 |
---|---|
JOIN 하는게 쉬워보이면 그 분은 이미 전문가 (1) | 2024.03.07 |
제 3정규형 차렷 (0) | 2024.02.27 |
2NF 완벽 이해 MASTER (0) | 2024.02.23 |
DB 1, 2 정규형 (1) | 2024.02.23 |