Добро упражнение за моделиране на данни за начинаещи е да създадете модел на данни на онлайн магазин . Всеки път, когато давам това упражнение на моите ученици, се учудвам колко трудно им е.
Намерете понятията...
Нека видим как може да се направи. Знаем, че трябва да създадем таблица за всяка концепция в домейна. Помислете за съществителните и съществителни фрази ще използвате, за да опишете домейна. Грубо, всяко съществително е или понятие, атрибут на понятие, или пример . Какви са основните понятия в онлайн магазина? Веднага ми идват на ум две думи:
- клиенти – хора, които купуват неща в нашия магазин, и
- продукти – артикули, които хората купуват в нашия магазин.
Всеки клиент има основен набор от данни, които го описват:идентификатор (обикновено се нуждаете от атрибут id във вашата таблица), име, имейл и парола. По същия начин продуктът има идентификатор и име. Бихме могли да добавим още атрибути за клиенти и продукти, но в името на този пример, това ще стане. Добавяме двете таблици в нашия модел.
... Както и абстрактните понятия
Това е магазин, така че очевидно искаме да знаем какво е поръчан и от кого . „Поръчка“ е ключова дума в повечето бази данни, така че не трябва да я използваме за име на таблица. Вместо това ще използваме името purchase
за третата маса в нашия модел. Таблицата трябва да е свързана по някакъв начин с customer
и към product
. За начало нека просто начертаем препратка между purchase
и customer
и между purchase
и product
.
customer-purchase
справката е ОК. Всяка покупка се извършва от един клиент; всеки клиент може да направи няколко покупки. Тази препратка е тук, за да остане.
Нещо обаче не е наред с purchase-product
справка. Няколко продукта могат да бъдат закупени с една покупка; няколко покупки могат да включват един и същ продукт. Но нашата справка позволява само един продукт да бъде закупен с една покупка. Нека изтрием препратката и да помислим за различен начин да я моделираме.
Едно голямо текстово поле за всички закупени продукти?
Какво ще кажете да добавим голямо текстово поле, което може да съхранява имената или идентификаторите на закупените продукти? Сега можем да закупим няколко продукта с една покупка. Тук обаче има някои проблеми:
- Първо, трудно е да се провери дали продуктът в
purchased_items
полето наистина е в базата данни. - Второ, ако искате да промените името на продукта (защото сте го написали грешно), тогава трябва да актуализирате всички
purchased_items
екземпляри на полета вpurchase
маса. - Накрая е трудно да се анализират данните в базата данни. Например, ако искате да разберете кой продукт се купува най-често, трябва да използвате операция с текстов подниз. И това никога не е много ефективно.
Няколко продуктови колони в таблицата за покупки?
Какви са някои други опции? Искаме покупката да бъде свързана с няколко продукта, така че може би трябва да добавим няколко purchase_item
колони в таблица за покупки? Е, това е уморително (добавих само 5 колони и се уморих) и създава изкуствен и глупав ограничение на броя на закупените продукти.
Използвайте междинна маса!
Глупавото решение намеква за правилното решение. Искаме да имаме неограничен брой продукти, свързани с покупката. Единственият начин е да имате междинна свързваща маса . Нека го наречем purchase_item
. purchase_item
таблицата е свързана с purchase
и product
. Сега една покупка може да включва толкова продукти, колкото искаме. Като бонус можем да добавим допълнителни данни в таблицата:брой покупки, обща цена за този артикул и т.н.
Заключения:
- Таблиците в модела могат да представят не само физически обекти като клиент или продукт. Таблиците могат да представят повече абстрактни понятия като покупка. Други примери могат да бъдат резервация в система за хотелски резервации, book_loan в модел за библиотека, среща в система за лекари и др.
- Когато моделирате транзакция (т.е. покупка или продажба на много неща), обикновено имате нужда от три таблици :един за транзакцията (покупка или резервация в система за хотелски резервации), един за вещи, закупени/продадени в транзакция (продукт, хотелска стая) и един за елементи на транзакцията (purchase_item, booking_item). Можете да добавите допълнителна информация в междинната таблица, ако е необходимо.
Създайте свой собствен модел на база данни на магазина с Vertabelo!