바이브 코딩 시대의 데이터베이스4-4 ERD 읽는 법
테크타니 LEARN — 섹션 04 · DB 모델링

ERD 읽는 법 —
관계선을 문장으로

ERD는 외울 그림이 아니라 데이터가 어디에 있는지 알려주는 지도입니다. 지도를 통째로 외울 필요는 없어요. 기호를 읽는 법만 익히면 — 지금 질문에 필요한 길만 골라 따라갈 수 있습니다.

난이도보통소요8분준비물4-3 완료오늘기호보다 문장이 먼저

이번 섹션의 여정

4-1 관계의 구조

완료 ✓

4-2 부모 · 자식

완료 ✓

4-3 관계의 종류

완료 ✓

4-4 ERD 읽는 법

지금 여기

4-5 ~ 4-7

정규화 · 실무 ERD · 실습

ERD는 외울 그림이 아니라 지도입니다

지난 강의에서 우리는 1:1, 1:N, N:M말로 읽어봤습니다. 이번에는 그 관계가 ERD에 어떤 기호로 그려지는지를 봅니다.

ERD는 여러 테이블이 어떻게 연결되어 있는지 한 장에 모아 보여주는 지도예요. 우리 shop DB의 전체 지도는 이렇게 생겼습니다.

테이블 다섯 개에 관계선 네 개. 처음 보면 복잡해 보이지만 — 한 번에 다 읽을 필요가 없습니다.

⭐ 오늘의 한 문장

ERD 전체를 외우지 말고, 관계선 양쪽을 문장으로 읽은 뒤 지금 질문에 필요한 길만 따라갑니다.

처음 보는 ERD에서는 범례부터 확인합니다

오늘은 실무에서 가장 많이 쓰이는 Crow’s Foot, 우리말로 까마귀발 표기를 기준으로 보겠습니다.

ERD 표기법은 하나가 아닙니다

도구마다 기호 모양이 조금씩 다를 수 있습니다. 처음 보는 ERD를 받았다면 기호부터 해석하지 말고 범례(legend)를 먼저 확인하세요. 범례가 없다면 그린 사람에게 물어보는 게 가장 빠릅니다.

Crow’s Foot에서 외울 기본 뜻은 딱 세 개뿐입니다.

Crow's Foot — 기본 기호 세 개
관계선 끝의 기호읽는 뜻
작은 원 ( ○ )0 — 없어도 된다
세로 막대 ( │ )1 — 하나
세 갈래로 갈라진 까마귀발여러 개까지 가능하다
원 · 막대 · 까마귀발 — 이 세 개면 어떤 ERD든 읽기 시작할 수 있습니다

기호는 두 개를 한 묶음으로 읽습니다

관계선 끝에는 기호가 하나가 아니라 두 개 붙어 있습니다. 앞쪽 기호와 뒤쪽 기호를 한 묶음으로 읽어야 뜻이 완성돼요.

네 가지 조합과 실제 발음
숫자 표기소리 내어 읽으면기호 조합
0..1영 또는 하나없어도 되고, 있다면 하나원 + 막대
1..1정확히 하나반드시 하나가 연결된다막대 + 막대
0..N영 개부터 여러 개없어도 되고, 여러 개까지 가능원 + 까마귀발
1..N한 개부터 여러 개최소 한 개, 여러 개까지 가능막대 + 까마귀발
앞 숫자가 최소, 뒤 숫자가 최대 — 이 순서 하나만 기억하면 됩니다

0..1을 “영 점 점 일”이라고 읽지 마세요. “영 또는 하나” 처럼 뜻으로 읽어야 관계가 머릿속에 그려집니다.

N 은 지금 저장된 행 수가 아닙니다

0..NN“지금 3건이 들어 있다” 는 뜻이 아니라 “여러 개까지 가능하다”규칙입니다. 4-3에서 배운 그대로 — 현재 데이터가 아니라 업무가 허용하는 범위예요.

4-3의 최대에 최소가 붙었습니다

지난 강의에서 읽은 1:N최대 몇 개까지 연결되는지만 알려줬습니다. ERD 기호는 여기에 최소 몇 개부터를 덧붙인 것뿐이에요.

같은 관계, 정보가 하나 더 붙었을 뿐입니다

4-3 에서 읽은 것 — 최대만
  • 회원 → 주문주문 여러 건까지 가능 (N)

  • 주문 → 회원회원 한 명 (1)

  • 못 읽는 것주문이 0건이어도 되는지는 알 수 없다

4-4 에서 읽는 것 — 최소 .. 최대 ✓
  • 회원 → 주문0..N — 0건이어도 되고 여러 건까지 가능

  • 주문 → 회원1..1 — 반드시 정확히 한 명

  • 추가로 읽는 것연결이 필수인지, 비어 있어도 되는지

새로 외울 개념이 아닙니다 — 이미 읽던 최대 앞에 최소가 하나 붙은 것 뿐이에요.

관계선은 양쪽 끝을 두 문장으로 읽습니다

이제 membersorders를 잇는 관계선 하나만 크게 확대해 보겠습니다.

주문 쪽 끝에는 원과 까마귀발이 붙어 있습니다. 0..N, 영 개부터 여러 개예요.

회원 한 명은 주문을 0건부터 여러 건까지 가질 수 있다.

회원 쪽 끝에는 막대 두 개가 붙어 있습니다. 1..1, 정확히 하나예요.

주문 한 건은 회원 정확히 한 명의 것이다.

members — orders 관계선 양방향 읽기
읽는 방향관계선 끝의 표기완성된 문장
회원 → 주문0..N회원 한 명은 주문 0건부터 여러 건까지
주문 → 회원1..1주문 한 건은 회원 정확히 한 명
한쪽만 읽고 끝내면 관계의 절반만 아는 것입니다

그리고 이 관계선은 한쪽으로만 가는 화살표가 아닙니다. 회원에서 주문을 찾아갈 수도 있고, 주문에서 회원을 찾아갈 수도 있어요. 필요한 데이터는 어느 쪽에서든 따라갈 수 있습니다.

관계선과 FK 화살표를 섞지 마세요

4-2에서 본 외래키의 참조 방향(자식 → 부모)과 지금 읽는 관계선은 다른 이야기입니다. 관계선은 방향이 아니라 양쪽의 개수를 알려주는 선이에요.

⭐ 관계선을 읽는 습관

기호를 보면 반드시 두 문장을 만듭니다. 왼쪽에서 오른쪽으로 한 문장, 오른쪽에서 왼쪽으로 한 문장.

전체 ERD에서 길을 찾는 세 단계

테이블이 5개든 50개든 방법은 같습니다. 세 단계면 충분해요.

ERD에서 길을 찾는 세 단계
① 알아낼 질문을 한 문장으로 정한다
② 시작 테이블을 잡고, 질문에 필요한 관계선만 따라간다
③ 실제 데이터 한 건으로 그 길이 맞는지 확인한다

여기서 중요한 건 ②의 “필요한 선만” 입니다. 지도 전체를 훑지 말고, 질문과 상관없는 선은 잠시 지나쳐도 됩니다.

질문을 정하고 시작 테이블을 잡습니다

질문을 하나 정해보겠습니다.

오늘의 질문

주문 1번은 누가 했고, 어떤 상품을 몇 개 샀으며, 그 상품은 어느 카테고리일까?

질문이 주문을 묻고 있으니 시작 테이블은 orders, 그중에서도 1번 행입니다. 여기서 필요한 선만 따라가면 길은 두 갈래로 갈라져요.

질문: 주문 1번은 누가 했고, 어떤 상품을 몇 개 샀으며,
      그 상품은 어느 카테고리일까?

orders (주문 1번)
  ├─ members
  └─ order_items ─ products ─ categories

“누가”는 members에서, “어떤 상품을 몇 개”는 order_itemsproducts에서, “어느 카테고리”는 categories에서 찾습니다. 길을 먼저 그리고 나면 그다음은 값을 얹는 일만 남습니다.

주문 1번으로 실제 경로를 따라갑니다

이제 세 번째 단계 — 실제 값을 길 위에 올려볼 차례입니다. 먼저 출발점인 orders의 1번 행입니다.

shop DB — orders 의 1번 행
order_idmember_idordered_at
112025-02-01
주문 1번의 회원 번호는 1번입니다 — 여기가 members 로 가는 출입구

member_id가 1번이니 members의 1번 행을 찾아갑니다. 1번은 김철수예요. 첫 번째 답이 나왔습니다 — 주문 1번은 김철수 회원의 주문입니다.

이번에는 반대편 갈래, order_items입니다.

shop DB — 주문 1번의 order_items
order_idproduct_idquantity
111
1162
주문 1번에는 주문상세가 두 줄 있습니다

숫자 세 개가 나란히 있으니 순서를 정확히 읽어야 합니다.

한 줄씩 소리 내어 읽으면
주문상세 한 줄읽는 문장상품 이름카테고리
(1, 1, 1)주문 1번, 상품 1번, 수량 1개라운드 티셔츠1 · 의류
(1, 16, 2)주문 1번, 상품 16번, 수량 2개프리미엄 그래놀라3 · 식품
상품 이름은 products 에서, 카테고리는 products.category_id 를 따라 categories 에서 찾은 값입니다

첫 줄의 상품 1번은 products에서 라운드 티셔츠, 그 카테고리는 1번 의류입니다. 둘째 줄의 상품 16번은 프리미엄 그래놀라, 카테고리는 3번 식품이고요.

그래서 질문의 답은 이렇습니다.

✓ 세 단계로 찾아낸 답

김철수 회원의 주문 1번에는 라운드 티셔츠 1개와 프리미엄 그래놀라 2개가 들어 있고, 각각 의류와 식품에 속합니다.

SQL을 쓰기 전에 이미 알 수 있습니다

아직 SELECTJOIN도 쓰지 않았습니다. 그런데도 어떤 테이블을 어떤 순서로 거쳐야 하는지는 이미 다 나왔어요. 질문을 받으면 SQL부터 쓰지 말고 — ERD에서 길부터 그리는 습관을 들이세요.

shop 의 네 관계는 모두 같은 모양입니다

기호를 익혔으니 이제 처음의 전체 지도를 다시 읽어보겠습니다. 네 관계선이 모두 같은 조합이라는 게 보일 거예요.

shop 전체 관계망 — 최소 .. 최대로 읽기
관계표기두 문장으로 읽으면
members — orders1..1 ─── 0..N주문 한 건은 회원 정확히 한 명 / 회원 한 명은 주문 0건부터 여러 건
orders — order_items1..1 ─── 0..N주문상세 한 줄은 주문 정확히 한 건 / 주문 한 건은 주문상세 0줄부터 여러 줄
products — order_items1..1 ─── 0..N주문상세 한 줄은 상품 정확히 한 개 / 상품 한 개는 주문상세 0줄부터 여러 줄
categories — products1..1 ─── 0..N상품 한 개는 카테고리 정확히 한 개 / 카테고리 하나는 상품 0개부터 여러 개
자식 쪽 외래키가 모두 NOT NULL 이라 부모 쪽은 전부 1..1 입니다
주문상세가 0줄인 주문 — 구조상 가능합니다

orders — order_items의 최소가 0인 것은 현재 외래키 구조가 허용하는 범위를 그대로 읽은 결과입니다. “완료된 주문에는 상품이 반드시 한 개 있어야 한다” 같은 규칙은 지금 구조에 들어 있지 않아요. ERD는 적혀 있는 것만 읽는 게 원칙입니다.

한눈에 정리

기호숫자 표기소리 내어 읽으면
원 + 막대0..1영 또는 하나없어도 되고, 있다면 하나
막대 + 막대1..1정확히 하나반드시 하나가 연결된다
원 + 까마귀발0..N영 개부터 여러 개없어도 되고, 여러 개까지 가능
막대 + 까마귀발1..N한 개부터 여러 개최소 한 개, 여러 개까지 가능

앞이 최소, 뒤가 최대입니다. 처음 보는 ERD에서는 범례를 먼저 확인하고 — 관계선은 반드시 양쪽 끝을 두 문장으로 읽습니다.

그리고 길을 찾을 때는 질문 → 시작 테이블과 필요한 선 → 실제 한 건으로 확인, 이 세 단계면 충분해요. 주문 1번 하나로 membersorder_items, products, categories까지 따라가 본 것처럼요.

이제 ERD를 읽을 수 있게 됐습니다. 그런데 애초에 왜 테이블이 이렇게 여러 개로 나뉘어 있을까요? 회원 이름과 상품 이름을 한 표에 다 적으면 안 되는 걸까요? 다음 강의에서 그 이유를 봅니다.

NEXT LESSON4-5 정규화 직관 — 왜 테이블을 나누는가

넓은 표 한 장에서 생기는 수정·삽입·삭제 문제를 보고 — 각 사실을 자기 테이블로 보냅니다.

GO ▸ 4-5 시작하기