Магазинът
Проблем
Кой какво е поръчал?
Собственичката на магазина пита: „Какво имаше в последната поръчка и чия беше?“
В Excel щеше да има един ред с всичко. В базата отговорът е разпръснат в три таблици. Това звучи като усложнение, но е точно обратното. Нека видим защо.
Идеята
Шест таблици
Магазинът има шест таблици. Всяка е за един вид неща:
customers
- PK
idinteger nametext *emailtext *citytextjoined_attext *
categories
- PK
idinteger nametext *- FK
parent_idinteger→ categories
products
- PK
idinteger nametext *- FK
category_idinteger→ categories pricereal *stockinteger *added_attext *
orders
- PK
idinteger - FK
customer_idinteger *→ customers ordered_attext *statustext *
order_items
- PK
order_idinteger→ orders - PK
product_idinteger→ products quantityinteger *unit_pricereal *
reviews
- PK
idinteger - FK
product_idinteger *→ products - FK
customer_idinteger *→ customers ratinginteger *bodytextcreated_attext *
- customers: клиентите. categories: категориите на продуктите. products: продуктите, с цена в евро и наличност.
- orders: поръчките. Една поръчка е на един клиент, с дата и състояние: new, paid, shipped, delivered или cancelled.
- order_items: какво има във всяка поръчка. Един ред е един продукт в една поръчка.
- reviews: отзивите, с оценка от 1 до 5.
PK е колоната, по която редът се познава: числото id. FK е колона, която сочи към ред в друга таблица. Звездичката значи, че колоната не може да е празна.
По-точно, за любопитните
Цените са REAL, дробни числа. Датите са текст във вида 2026-10-19: SQLite няма отделен тип за дата, а в този вид текстът се подрежда правилно. В PostgreSQL и MySQL има типове DATE и NUMERIC и там се ползват те. Ще се върнем на типовете, когато правим свои таблици.
Виж го
Последната поръчка, ред по ред
Последната поръчка е 60. В orders тя има customer_id 1. Клиент 1 в customers е Мария Иванова.
Какво е поръчала? Редовете на поръчка 60 са в order_items. Пусни таблицата и слез до края:
Последните два реда са на поръчка 60: продукт 1, 2 броя по 1,20 €, и продукт 19, 4 броя по 2,90 €. Сега виж кои са продукти 1 и 19:
Бял хляб и препарат за съдове. Отговорът е събран от три таблици, а всеки факт е записан само веднъж: името на Мария, името на хляба, цената му.
По-точно, за любопитните
Търсенето с очи в 152 реда е бавно и лесно се бърка. В следващия модул ще кажеш на базата „само редовете на поръчка 60“, а по-късно ще събереш трите таблици в една заявка с JOIN.
Пробвай
Чий е отзивът?
Упражнение
Отзивите
Покажи всички отзиви (таблица reviews). Кой е отзивът с най-ниска оценка и за кой продукт е?
Решение
SELECT * FROM reviews;16 отзива. Най-ниската оценка е 1, в отзив 13: „Кафето беше с изтекъл срок.“ Той е за продукт 17, кафето на зърна, а го е писал клиент 12, Борис.
Тест