테이블이 세 개, 네 개 넘어가면 말로 설명하기가 힘들어진다. "회원 테이블이 주문 테이블과 연결되고, 주문 테이블은 상품 테이블과 중간 테이블을 통해 연결되고..." — 듣는 사람도, 말하는 사람도 금방 헷갈린다. ERD(Entity-Relationship Diagram)는 이 관계를 그림으로 표현한 것이다.
ERD는 세 가지로 구성된다. 엔티티, 속성, 관계.

데이터로 관리할 대상이다. 테이블 하나가 엔티티 하나에 해당한다. ERD에서는 사각형으로 표현한다.
쇼핑몰을 예로 들면 회원, 주문, 상품이 각각 엔티티다.
엔티티가 가지는 데이터 항목이다. 테이블의 컬럼에 해당한다. ERD에서는 엔티티 안에 컬럼 목록으로 표현하거나, 별도로 타원으로 이어 표현하기도 한다.
회원 엔티티의 속성은 member_id, member_name, email 등이다. 기본 키는 보통 밑줄이나 PK 표시로 구분한다.
엔티티 사이의 연결이다. ERD에서는 엔티티를 잇는 선으로 표현하며, 선 끝에 기호를 붙여 관계 차수(1:1, 1:N, N:M)를 나타낸다.
ERD를 그리는 방식이 여러 가지 있는데, 가장 많이 쓰이는 건 IE 표기법(Information Engineering Notation)이다. 선 끝 모양이 새 발처럼 생겼다고 해서 Crow's Foot 표기법이라고도 부른다.

선 끝에 붙는 기호의 의미는 다음과 같다.
| 기호 | 의미 |
|---|---|
| ` | ` (수직선 하나) |
| ` | |
O (원) | 0 (없을 수도 있음) |
< (새 발) | 여러 개 (N) |
이 기호들을 조합해 관계 차수를 표현한다.
| 관계 | 표기 예시 |
|---|---|
| 1:1 | |——| |
| 1:N | |——< |
| 0 또는 1 : N | O|——< |
| N:M | >——< |
앞서 만든 쇼핑몰 구조를 ERD로 표현하면 이렇다.
members orders order_items products
+-------------+ +-------------+ +-------------+ +-------------+
| member_id PK| | order_id PK| | order_id PK| | product_id PK|
| member_name | | member_id FK| | product_id PK | product_name |
| email | | order_date | | quantity | | price |
+-------------+ +-------------+ +-------------+ +-------------+
| | | |
|_____________________| |_____________________|
1:N N:M 중간 테이블
텍스트로 표현하면 한계가 있지만, 구조를 읽어보면 이렇다.
members — orders: 회원 한 명이 주문을 여러 건 할 수 있다 (1:N)orders — order_items — products: 주문과 상품은 중간 테이블을 통해 N:M으로 연결된다
실제로는 draw.io, MySQL Workbench, dbdiagram.io 같은 도구로 그린다. 이 중 dbdiagram.io는 SQL 문법과 비슷한 텍스트를 입력하면 ERD를 자동으로 그려줘서 편리하다.
코드를 먼저 짜고 나중에 ERD를 그리는 경우도 있지만, 반대 순서가 더 낫다. 테이블을 만들기 전에 ERD를 그려보면 관계 차수를 잘못 설정한 부분, 빠진 엔티티, 불필요하게 중복된 속성 등이 눈에 보인다.
SQL로 테이블을 다 만든 뒤에 구조를 바꾸는 건 번거롭다. 기존 데이터가 있으면 더 복잡해진다. ERD 단계에서 미리 잡아두는 게 훨씬 수월하다.