Одна схема на весь курс. Держи эту страницу открытой рядом — все упражнения работают с этими таблицами.
Шесть таблиц данных + одна пустая-по-товарам категория. Стрелка → означает внешний ключ
(foreign key): значение столбца ссылается на строку другой таблицы. В данные намеренно вшиты «ловушки»
(NULL-ы, заказы без оплат, категория без товаров) — на них строятся глубокие темы.
customers ──< orders ──< order_items >── products >── categories
│
└──< payments
«──<» читается как «один ко многим»:
один customer → много orders
один order → много order_items и (0..1) payments
один product → много order_items
одна category → много products
| Столбец | Тип | Заметки |
|---|---|---|
customer_id | int | PK |
name | text | NOT NULL |
email | text | UNIQUE · у Jack Wilson (id 10) — NULL |
country | text | NULL у Dmitry (4) и Grace (7) |
created_at | date | дата регистрации |
10 строк. Jack Wilson (id 10) не имеет ни одного заказа — удобен для анти-join.
| Столбец | Тип | Заметки |
|---|---|---|
category_id | int | PK |
name | text | NOT NULL |
7 строк: Electronics, Books, Clothing, Home, Toys, Sports, Garden. У Garden нет товаров — удобна для LEFT JOIN.
| Столбец | Тип | Заметки |
|---|---|---|
product_id | int | PK |
name | text | NOT NULL |
category_id | int | → categories.category_id |
price | numeric(10,2) | цена за единицу |
stock | int | 0 у Headphones (4) и Jeans (10) — нет на складе |
18 строк.
| Столбец | Тип | Заметки |
|---|---|---|
order_id | int | PK |
customer_id | int | → customers.customer_id |
status | text | одно из: paid, shipped, pending, cancelled |
created_at | date | дата заказа |
14 строк (id 100–113). Только paid и shipped заказы имеют строку в payments. pending/cancelled — без оплаты.
| Столбец | Тип | Заметки |
|---|---|---|
order_item_id | int | PK |
order_id | int | → orders.order_id |
product_id | int | → products.product_id |
quantity | int | кол-во |
unit_price | numeric(10,2) | цена на момент заказа (обычно = price) |
24 строки. Сумма позиции = quantity * unit_price.
| Столбец | Тип | Заметки |
|---|---|---|
payment_id | int | PK |
order_id | int | → orders.order_id |
amount | numeric(10,2) | = сумма позиций заказа |
method | text | card, paypal, wire |
paid_at | date | дата оплаты |
10 строк — по одной на каждый paid/shipped заказ.
Любую таблицу можно посмотреть в любом уроке: напиши в редакторе SELECT * FROM orders; и нажми «Выполнить».
Полную DDL и вставки см. в assets/seed.js.