Към съдържанието
wannacode

Магазинът

Проблем

Кой какво е поръчал?

Собственичката на магазина пита: „Какво имаше в последната поръчка и чия беше?“

В Excel щеше да има един ред с всичко. В базата отговорът е разпръснат в три таблици. Това звучи като усложнение, но е точно обратното. Нека видим защо.

Идеята

Шест таблици

Магазинът има шест таблици. Всяка е за един вид неща:

customers

  • PKidinteger
  • nametext *
  • emailtext *
  • citytext
  • joined_attext *

categories

  • PKidinteger
  • nametext *
  • FKparent_idinteger→ categories

products

  • PKidinteger
  • nametext *
  • FKcategory_idinteger→ categories
  • pricereal *
  • stockinteger *
  • added_attext *

orders

  • PKidinteger
  • FKcustomer_idinteger *→ customers
  • ordered_attext *
  • statustext *

order_items

  • PKorder_idinteger→ orders
  • PKproduct_idinteger→ products
  • quantityinteger *
  • unit_pricereal *

reviews

  • PKidinteger
  • FKproduct_idinteger *→ products
  • FKcustomer_idinteger *→ customers
  • ratinginteger *
  • bodytext
  • created_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. Пусни таблицата и слез до края:

SQLбаза: магазин

Последните два реда са на поръчка 60: продукт 1, 2 броя по 1,20 €, и продукт 19, 4 броя по 2,90 €. Сега виж кои са продукти 1 и 19:

SQLбаза: магазин

Бял хляб и препарат за съдове. Отговорът е събран от три таблици, а всеки факт е записан само веднъж: името на Мария, името на хляба, цената му.

По-точно, за любопитните

Търсенето с очи в 152 реда е бавно и лесно се бърка. В следващия модул ще кажеш на базата „само редовете на поръчка 60“, а по-късно ще събереш трите таблици в една заявка с JOIN.

Пробвай

Чий е отзивът?

1. Отзив 3 е за продукт 17. Кой продукт е това? (Пусни продуктите горе и потърси id 17.)

Упражнение

Отзивите

Покажи всички отзиви (таблица reviews). Кой е отзивът с най-ниска оценка и за кой продукт е?

SQLбаза: магазин

Тест

Провери се

1. Колко пъти в базата е записано името на продукт 1, „Бял хляб“?
2. Защо order_items пази unit_price, а не взима цената от products?
3. Поръчка 60 има два реда в order_items. Какво значи това?

Създаден от Иво Гергов като част от кампанията на Evo Tech за достъпно обучение по програмиране ·