Вставка позиций и подэлементов в заказ - PullRequest
0 голосов
/ 04 мая 2018

Мне нужно иметь возможность добавлять подэлементы в мою систему заказов.

У меня есть такая структура:

enter image description here

Этот подпункт похож на дополнительную модель для блюда.

Как, например, в гамбургере, если клиент хочет добавить салат, помидор или лук. Также необходимо, чтобы item_id идентифицировал, к какому элементу этого порядка принадлежит подпункт.

Тогда я получу эту модель:

Фиксированная модель

  • Это лучший способ сделать это?
  • У меня будут проблемы с производительностью при запросе?

РЕДАКТИРОВАТЬ:

  1. Причина item_id в Order_SubItems заключается в ссылке на Item_id, которому принадлежит подэлемент.
  2. В одном и том же заказе может быть несколько предметов с одинаковым идентификатором. Но они могут иметь только один тип каждого подэлемента.
  3. Возможно, мне понадобится столбец item_pos, чтобы узнать, к какому элементу относится данный подэлемент в случае, если у него 2 элемента с одинаковым идентификатором.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Проблемы с производительностью (зависит от того, как вы выбираете - нетерпеливая / ленивая загрузка)

Дизайн базы данных менее важен для производительности в Laravel, а важна реализация вашего проекта в Laravel (как вы собираетесь реализовывать свой дизайн). Если вы правильно реализуете любую сложную модель в Laravel, используя все показатели производительности, то, конечно, не имеет значения, насколько сложным или сколько отношений вы вводите на стороне вашей базы данных.

Я бы хотел порекомендовать вам установить laravel debugbar и сравнить количество запросов и производительность на основе разного дизайна. Когда вы получите достаточно информации о панели отладки Laravel, тогда примените методы кэширования и индексации laravel. Существует целый новый мир настройки производительности Laravel.

ПРИМЕЧАНИЕ: Структура и сложность базы данных как-то определяют производительность, но реальная производительность - это то, как вы собираетесь реализовать это в Laravel.

Пожалуйста, посмотрите на:

  • Laravel Debug Bar
  • Стремительная загрузка против отложенной загрузки (Eloquent)
  • Кеширование объектов, Кэширование конфигурации
  • Индексирование MySQL
  • Команда оптимизации (Команды Artisan)
  • Кэш маршрутов
  • Блок данных базы данных

Вы можете найти множество учебников по вышеуказанным темам, просто вам нужно найти производительность Laravel. Не бойтесь представить любую сложную модель (Database Design) с Laravel. Так вы научитесь «как оптимизировать» или «вам действительно нужно отрезать какие-либо модели». Никто не может предложить вам лучший дизайн базы данных до тех пор, пока вы не получите полный документ спецификации требований (App Detail). Лучше, если вы разрабатываете свое приложение на основе различных показателей производительности, доступных в laravel.

Я публикую это в ответ на ваш запрос производительности и настройки производительности.

0 голосов
/ 04 мая 2018

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

Чтобы решить подпункты, я бы предложил использовать одну модель для всех элементов в заказе, просто добавив parent_id и затем указав ссылку на него в подпунктах.

Например, давайте добавим бургер с items_id 1 и нулевым parent_id. Затем, если мы хотим добавить немного вкусного бекона, он становится items_id 2 с parent_id 1. Дополнительный patty, та же идея ... которая становится items_id 3 с parent_id 1. Приятная вещь в этой структуре - вы можете иметь по существу бесконечные подпункты ... и столько уровней, сколько вам нужно.

Я мог бы также предложить добавить цену к моделям order_items, чтобы зафиксировать цену в точке продажи. Таким образом, если цена товара изменяется (или у вас есть продажа, купон, скидка и т. Д.), Ваши исторические номера сохраняются.

Вы также можете преобразовать все валютные поля (цена, сумма и т. Д.) В центы и сохранить их в базе данных как целые числа. Как правило, это даст вам лучшую производительность (по сравнению с varchar), хорошо работает со всеми основными валютами и позволяет избежать некоторых проблем с округлением, которые могут возникнуть с типами данных decimal.

0 голосов
/ 04 мая 2018

Почему так сложно?

order и order_items - это именно то, что вам нужно. Добавьте столбец is_incredient (TINYINT) или is_extra (TINYINT) к элементу order_items, и это все.

Нет необходимости разделять цену, название и количество.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...