ERD 읽는 법 —
관계선을 문장으로
ERD는 외울 그림이 아니라 데이터가 어디에 있는지 알려주는 지도입니다. 지도를 통째로 외울 필요는 없어요. 기호를 읽는 법만 익히면 — 지금 질문에 필요한 길만 골라 따라갈 수 있습니다.
이번 섹션의 여정
완료 ✓
완료 ✓
완료 ✓
지금 여기
정규화 · 실무 ERD · 실습
ERD는 외울 그림이 아니라 지도입니다
지난 강의에서 우리는 1:1, 1:N, N:M을 말로 읽어봤습니다. 이번에는 그 관계가 ERD에 어떤 기호로 그려지는지를 봅니다.
ERD는 여러 테이블이 어떻게 연결되어 있는지 한 장에 모아 보여주는 지도예요. 우리 shop DB의 전체 지도는 이렇게 생겼습니다.
테이블 다섯 개에 관계선 네 개. 처음 보면 복잡해 보이지만 — 한 번에 다 읽을 필요가 없습니다.
ERD 전체를 외우지 말고, 관계선 양쪽을 문장으로 읽은 뒤 지금 질문에 필요한 길만 따라갑니다.
처음 보는 ERD에서는 범례부터 확인합니다
오늘은 실무에서 가장 많이 쓰이는 Crow’s Foot, 우리말로 까마귀발 표기를 기준으로 보겠습니다.
도구마다 기호 모양이 조금씩 다를 수 있습니다. 처음 보는 ERD를 받았다면 기호부터 해석하지 말고 범례(legend)를 먼저 확인하세요. 범례가 없다면 그린 사람에게 물어보는 게 가장 빠릅니다.
Crow’s Foot에서 외울 기본 뜻은 딱 세 개뿐입니다.
| 관계선 끝의 기호 | 읽는 뜻 |
|---|---|
| 작은 원 ( ○ ) | 0 — 없어도 된다 |
| 세로 막대 ( │ ) | 1 — 하나 |
| 세 갈래로 갈라진 까마귀발 | 여러 개까지 가능하다 |
기호는 두 개를 한 묶음으로 읽습니다
관계선 끝에는 기호가 하나가 아니라 두 개 붙어 있습니다. 앞쪽 기호와 뒤쪽 기호를 한 묶음으로 읽어야 뜻이 완성돼요.
| 숫자 표기 | 소리 내어 읽으면 | 뜻 | 기호 조합 |
|---|---|---|---|
| 0..1 | 영 또는 하나 | 없어도 되고, 있다면 하나 | 원 + 막대 |
| 1..1 | 정확히 하나 | 반드시 하나가 연결된다 | 막대 + 막대 |
| 0..N | 영 개부터 여러 개 | 없어도 되고, 여러 개까지 가능 | 원 + 까마귀발 |
| 1..N | 한 개부터 여러 개 | 최소 한 개, 여러 개까지 가능 | 막대 + 까마귀발 |
0..1을 “영 점 점 일”이라고 읽지 마세요. “영 또는 하나” 처럼 뜻으로 읽어야 관계가 머릿속에 그려집니다.
0..N의 N은 “지금 3건이 들어 있다” 는 뜻이 아니라 “여러 개까지 가능하다”
는 규칙입니다. 4-3에서 배운 그대로 — 현재 데이터가 아니라 업무가 허용하는
범위예요.
4-3의 최대에 최소가 붙었습니다
지난 강의에서 읽은 1:N은 최대 몇 개까지 연결되는지만 알려줬습니다. ERD 기호는 여기에 최소 몇 개부터를 덧붙인 것뿐이에요.
같은 관계, 정보가 하나 더 붙었을 뿐입니다
회원 → 주문주문 여러 건까지 가능 (
N)주문 → 회원회원 한 명 (
1)못 읽는 것주문이 0건이어도 되는지는 알 수 없다
회원 → 주문
0..N— 0건이어도 되고 여러 건까지 가능주문 → 회원
1..1— 반드시 정확히 한 명추가로 읽는 것연결이 필수인지, 비어 있어도 되는지
새로 외울 개념이 아닙니다 — 이미 읽던 최대 앞에 최소가 하나 붙은 것 뿐이에요.
관계선은 양쪽 끝을 두 문장으로 읽습니다
이제 members와 orders를 잇는 관계선 하나만 크게 확대해 보겠습니다.
주문 쪽 끝에는 원과 까마귀발이 붙어 있습니다. 0..N, 영 개부터 여러 개예요.
회원 한 명은 주문을 0건부터 여러 건까지 가질 수 있다.
회원 쪽 끝에는 막대 두 개가 붙어 있습니다. 1..1, 정확히 하나예요.
주문 한 건은 회원 정확히 한 명의 것이다.
| 읽는 방향 | 관계선 끝의 표기 | 완성된 문장 |
|---|---|---|
| 회원 → 주문 | 0..N | 회원 한 명은 주문 0건부터 여러 건까지 |
| 주문 → 회원 | 1..1 | 주문 한 건은 회원 정확히 한 명 |
그리고 이 관계선은 한쪽으로만 가는 화살표가 아닙니다. 회원에서 주문을 찾아갈 수도 있고, 주문에서 회원을 찾아갈 수도 있어요. 필요한 데이터는 어느 쪽에서든 따라갈 수 있습니다.
4-2에서 본 외래키의 참조 방향(자식 → 부모)과 지금 읽는 관계선은 다른 이야기입니다. 관계선은 방향이 아니라 양쪽의 개수를 알려주는 선이에요.
기호를 보면 반드시 두 문장을 만듭니다. 왼쪽에서 오른쪽으로 한 문장, 오른쪽에서 왼쪽으로 한 문장.
전체 ERD에서 길을 찾는 세 단계
테이블이 5개든 50개든 방법은 같습니다. 세 단계면 충분해요.
여기서 중요한 건 ②의 “필요한 선만” 입니다. 지도 전체를 훑지 말고, 질문과 상관없는 선은 잠시 지나쳐도 됩니다.
질문을 정하고 시작 테이블을 잡습니다
질문을 하나 정해보겠습니다.
주문 1번은 누가 했고, 어떤 상품을 몇 개 샀으며, 그 상품은 어느 카테고리일까?
질문이 주문을 묻고 있으니 시작 테이블은 orders, 그중에서도 1번 행입니다. 여기서 필요한 선만 따라가면 길은 두 갈래로 갈라져요.
질문: 주문 1번은 누가 했고, 어떤 상품을 몇 개 샀으며,
그 상품은 어느 카테고리일까?
orders (주문 1번)
├─ members
└─ order_items ─ products ─ categories“누가”는 members에서, “어떤 상품을 몇 개”는 order_items와 products에서, “어느 카테고리”는 categories에서 찾습니다. 길을 먼저 그리고 나면 그다음은 값을 얹는 일만 남습니다.
주문 1번으로 실제 경로를 따라갑니다
이제 세 번째 단계 — 실제 값을 길 위에 올려볼 차례입니다. 먼저 출발점인 orders의 1번 행입니다.
| order_id | member_id | ordered_at |
|---|---|---|
| 1 | 1 | 2025-02-01 |
member_id가 1번이니 members의 1번 행을 찾아갑니다. 1번은 김철수예요. 첫 번째 답이 나왔습니다 — 주문 1번은 김철수 회원의 주문입니다.
이번에는 반대편 갈래, order_items입니다.
| order_id | product_id | quantity |
|---|---|---|
| 1 | 1 | 1 |
| 1 | 16 | 2 |
숫자 세 개가 나란히 있으니 순서를 정확히 읽어야 합니다.
| 주문상세 한 줄 | 읽는 문장 | 상품 이름 | 카테고리 |
|---|---|---|---|
| (1, 1, 1) | 주문 1번, 상품 1번, 수량 1개 | 라운드 티셔츠 | 1 · 의류 |
| (1, 16, 2) | 주문 1번, 상품 16번, 수량 2개 | 프리미엄 그래놀라 | 3 · 식품 |
첫 줄의 상품 1번은 products에서 라운드 티셔츠, 그 카테고리는 1번 의류입니다. 둘째 줄의 상품 16번은 프리미엄 그래놀라, 카테고리는 3번 식품이고요.
그래서 질문의 답은 이렇습니다.
김철수 회원의 주문 1번에는 라운드 티셔츠 1개와 프리미엄 그래놀라 2개가 들어 있고, 각각 의류와 식품에 속합니다.
아직 SELECT도 JOIN도 쓰지 않았습니다. 그런데도 어떤 테이블을 어떤 순서로
거쳐야 하는지는 이미 다 나왔어요. 질문을 받으면 SQL부터 쓰지 말고 —
ERD에서 길부터 그리는 습관을 들이세요.
shop 의 네 관계는 모두 같은 모양입니다
기호를 익혔으니 이제 처음의 전체 지도를 다시 읽어보겠습니다. 네 관계선이 모두 같은 조합이라는 게 보일 거예요.
| 관계 | 표기 | 두 문장으로 읽으면 |
|---|---|---|
| members — orders | 1..1 ─── 0..N | 주문 한 건은 회원 정확히 한 명 / 회원 한 명은 주문 0건부터 여러 건 |
| orders — order_items | 1..1 ─── 0..N | 주문상세 한 줄은 주문 정확히 한 건 / 주문 한 건은 주문상세 0줄부터 여러 줄 |
| products — order_items | 1..1 ─── 0..N | 주문상세 한 줄은 상품 정확히 한 개 / 상품 한 개는 주문상세 0줄부터 여러 줄 |
| categories — products | 1..1 ─── 0..N | 상품 한 개는 카테고리 정확히 한 개 / 카테고리 하나는 상품 0개부터 여러 개 |
orders — order_items의 최소가 0인 것은 현재 외래키 구조가 허용하는
범위를 그대로 읽은 결과입니다. “완료된 주문에는 상품이 반드시 한 개 있어야
한다” 같은 규칙은 지금 구조에 들어 있지 않아요. ERD는 적혀 있는 것만 읽는
게 원칙입니다.
한눈에 정리
| 기호 | 숫자 표기 | 소리 내어 읽으면 | 뜻 |
|---|---|---|---|
| 원 + 막대 | 0..1 | 영 또는 하나 | 없어도 되고, 있다면 하나 |
| 막대 + 막대 | 1..1 | 정확히 하나 | 반드시 하나가 연결된다 |
| 원 + 까마귀발 | 0..N | 영 개부터 여러 개 | 없어도 되고, 여러 개까지 가능 |
| 막대 + 까마귀발 | 1..N | 한 개부터 여러 개 | 최소 한 개, 여러 개까지 가능 |
앞이 최소, 뒤가 최대입니다. 처음 보는 ERD에서는 범례를 먼저 확인하고 — 관계선은 반드시 양쪽 끝을 두 문장으로 읽습니다.
그리고 길을 찾을 때는 질문 → 시작 테이블과 필요한 선 → 실제 한 건으로 확인, 이 세 단계면 충분해요. 주문 1번 하나로 members와 order_items, products, categories까지 따라가 본 것처럼요.
이제 ERD를 읽을 수 있게 됐습니다. 그런데 애초에 왜 테이블이 이렇게 여러 개로 나뉘어 있을까요? 회원 이름과 상품 이름을 한 표에 다 적으면 안 되는 걸까요? 다음 강의에서 그 이유를 봅니다.