Подтвердить что ты не робот

Pizza & Food - дизайн базы данных

Я хочу создать веб-сайт, который позволит клиенту заказывать еду с веб-сайта.

Существует два типа пищи:

  • регулярное питание/напиток (например: гамбургер, доннер-кебаб, чип, кокс, пепси и т.д.).
  • Пицца (например: пицца Маргерита, пицца мяса и т.д.)

Если они выбирают пиццу из списка - им может потребоваться выбрать "База" (тонкая корка, копия), "Дополнительно" и размер/вариант пиццы.

Как создать таблицы в этой ситуации?

Примечание. Каждый элемент имеет 1 или несколько параметров. Опция может иметь дополнительные (1 или более) или без дополнительных. Если элемент - тип пиццы - тогда он может иметь основание (корку)

Прототип скриншотов

Посмотрите два скриншота, которые я пытаюсь реализовать, я на правильном пути в дизайне базы данных или что могло бы сделать лучше?

Настройка пиццы:

GUI-Mockup to customize pizza

Бюргер для говядины настроить:

GUI-Mockup for the burger options

Функциональность дополнительных функций (Dropdown/tickboxes)

В дополнение, когда-нибудь мне нужно добавить несколько дополнительных компонентов для выпадающего списка, а также тикбокс. Это означает, что клиент может выбрать только 1 из 1, 2 или 3 выпадающих меню.

GUI-Mockup extra dropdowns

Дизайн базы данных

Как бы вы настроили свой модуль базы данных для реализации чего-то вроде вышеупомянутых параметров настройки? Вот что я придумал:

категории Таблица:

+----------+--------------+------+-----+---------+----------------+
| 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" пицц. Также будет случай, когда каждая пицца будет иметь разную стоимость дополнительных услуг.

Является ли дизайн базы данных правильным или что можно улучшить?

4b9b3361

Ответ 1

Я застрял с функциональностью Extras - как создать таблицу и поля для раскрывающихся приложений? См. Мой вопрос "Функциональность Extras (Dropdown/tickboxes)"

Если вам нужно создать раскрывающийся список, поместите значения для выпадающего списка в таблице.
Это нормально, чтобы добавить дополнительные значения, если вы можете легко выделить нужные вам значения в раскрывающемся списке.

Example

table option_labels
-------------------
id    integer auto_increment PK
name  varchar(40)

table toppings
--------------
id               integer  auto_increment PK
option_label_id  integer  foreign key references option_labels(id)
item_id          integer  foreign key references items(item_id)
price            decimal(10,2)

Как только вы узнаете этот пункт, вы можете заполнить выпадающий список, используя:

SELECT ol.name, t.price FROM toppings t
INNER JOIN option_labels ol ON (t.option_label_id = ol.id)
WHERE t.item_id = '$item_id'

Нормализовать эти таблицы
Эта таблица имеет главный недостаток:

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 |
+----------+-----------+-----------+------+

Он не нормируется, помещает имена в отдельную таблицу ярлыков, как в приведенном выше примере. Если строка (исключая идентификатор) уникальна не, то ваши данные не нормализуются, и вы делаете это неправильно.

Поскольку вы используете много подключений, IMHO лучше всего использовать InnoDB, у него есть некоторые интересные функции для ускорения объединений, которые часто используют ПК.

Независимо от того, что говорят люди
Не денормализуйте, пока не начнется медленность.

Использовать индексы
Поместите индекс во все поля с именем * _id.
Также поставьте индекс на все поля, которые часто используются в предложениях where.
Не помещать индексы в поля с низкой мощностью, поэтому нет индекса в логическом или перечислительном поле!
Индексы замедляют вставки и ускоряют выбор.

Ответ 2

У вас есть таблица заказов. Затем введите позицию заказа или таблицу строк заказа. С элементами, которые могут иметь ингредиенты на нем, вы получите стол, в котором содержатся ингредиенты. С пиццей, в частности, вам приходится беспокоиться о половине, поэтому люди могут заказывать разные вещи на каждую половину. До сих пор, похоже, вы направляетесь в правильном направлении.

Как я прохожу через дизайн, я сначала выясняю "объекты". Есть ощутимые объекты, такие как гамбургер или пицца, и есть неосязаемые объекты, такие как заказ, строка заказа.

Pizza Hut имеет один из лучших пользовательских интерфейсов для настройки пиццы в Интернете. Я бы посмотрел на него, поскольку он даст вам несколько идей о том, как хранить данные.