Я хочу создать веб-сайт, который позволит клиенту заказывать еду с веб-сайта.
Существует два типа пищи:
- регулярное питание/напиток (например: гамбургер, доннер-кебаб, чип, кокс, пепси и т.д.).
- Пицца (например: пицца Маргерита, пицца мяса и т.д.)
Если они выбирают пиццу из списка - им может потребоваться выбрать "База" (тонкая корка, копия), "Дополнительно" и размер/вариант пиццы.
Как создать таблицы в этой ситуации?
Примечание. Каждый элемент имеет 1 или несколько параметров. Опция может иметь дополнительные (1 или более) или без дополнительных. Если элемент - тип пиццы - тогда он может иметь основание (корку)
Прототип скриншотов
Посмотрите два скриншота, которые я пытаюсь реализовать, я на правильном пути в дизайне базы данных или что могло бы сделать лучше?
Настройка пиццы:
Бюргер для говядины настроить:
Функциональность дополнительных функций (Dropdown/tickboxes)
В дополнение, когда-нибудь мне нужно добавить несколько дополнительных компонентов для выпадающего списка, а также тикбокс. Это означает, что клиент может выбрать только 1 из 1, 2 или 3 выпадающих меню.
Дизайн базы данных
Как бы вы настроили свой модуль базы данных для реализации чего-то вроде вышеупомянутых параметров настройки? Вот что я придумал:
категории Таблица:
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| cat_id | int(11) | NO | PRI | NULL | auto_increment |
| cat_name | varchar(100) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
Таблица элементов
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| item_id | int(11) | NO | PRI | NULL | auto_increment |
| cat_id | int(11) | NO | | NULL | |
| item_name | varchar(100) | NO | | NULL | |
| item_type | int(11) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
- item_type (0 = нормальный, 1 = пицца, 2 = набор еды)
item_options Таблица:
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| option_id | int(11) | NO | PRI | NULL | auto_increment |
| item_id | int(11) | NO | | NULL | |
| option_name | varchar(100) | NO | | NULL | |
| price | decimal(6,2) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
item_extras Таблица: (Как вы думаете, должны ли быть отдельные таблицы для пиццы toppin и дополнения?)
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| extra_id | int(11) | NO | PRI | NULL | auto_increment |
| option_id | int(11) | NO | | NULL | |
| name | varchar(50) | NO | | NULL | |
| cost | decimal(6,2) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
item_pizza_base Таблица:
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| base_id | int(11) | NO | PRI | NULL | auto_increment |
| option_id | int(11) | NO | | NULL | |
| base_name | varchar(50) | NO | | NULL | |
| cost | decimal(6,2) | NO | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
Результат SQL:
mysql> select * from categories;
+--------+----------+
| cat_id | cat_name |
+--------+----------+
| 1 | Pizzas |
| 2 | Burgers |
mysql> select * from items;
+---------+--------+------------------+-----------+
| item_id | cat_id | item_name | item_type |
+---------+--------+------------------+-----------+
| 1 | 1 | Vegetarian Pizza | 1 |
| 2 | 2 | Beef Burger | 0 |
mysql> select * from item_options;
+-----------+---------+-------------+-------+
| option_id | item_id | option_name | price |
+-----------+---------+-------------+-------+
| 1 | 1 | 12 Inches | 5.60 |
| 2 | 1 | 14 Inches | 7.20 |
| 3 | 2 | 1/4lb | 1.80 |
| 4 | 2 | 1/2lb | 2.50 |
mysql> select * from item_extras;
+----------+-----------+-----------+------+
| extra_id | option_id | name | cost |
+----------+-----------+-----------+------+
| 1 | 1 | Mushroom | 1.00 |
| 2 | 1 | Pepperoni | 1.00 |
| 3 | 2 | Mushroom | 1.00 |
| 4 | 2 | Pepperoni | 1.00 |
| 5 | 3 | Chips | 0.50 |
| 6 | 4 | Chips | 0.50 |
Как вы можете видеть дополнения от гамбургера и пиццы в 1 таблице.
mysql> select * from item_pizza_base;
+---------+-----------+------------+------+
| base_id | option_id | base_name | cost |
+---------+-----------+------------+------+
| 1 | 1 | Thin Crust | 0.00 |
| 2 | 1 | Deep Crust | 0.00 |
| 3 | 2 | Thin Crust | 0.00 |
| 4 | 2 | Deep Crust | 0.00 |
+---------+-----------+------------+------+
Имейте в виду, что дополнительные цены для каждого товара не всегда одинаковы. Например: размер пиццы 10 "будет стоить 1,00 за каждый дополнительный, но 0,50 для 12" пицц. Также будет случай, когда каждая пицца будет иметь разную стоимость дополнительных услуг.
Является ли дизайн базы данных правильным или что можно улучшить?