【问题标题】:Inserting Items and SubItems to a Order将项目和子项目插入订单
【发布时间】:2018-10-15 04:52:19
【问题描述】:

我需要能够将子项目添加到我的订单系统。

我有这个结构:

子项就像是一道菜的附加模型。

例如在汉堡中,以防客户想要添加生菜、番茄或洋葱。它还需要 item_id 来标识子项属于该订单的哪个项。

然后我最终得到了这个模型:

Fixed Model

  • 这是最好的方法吗?
  • 查询时会不会出现性能问题?

编辑:

  1. Order_SubItems中item_id的原因是引用了子item所属的Item_id。
  2. 同一订单可以有多个相同 ID 的商品。但是每个子项只能有一种类型。
  3. 也许我需要一个 item_pos 列来知道子项目属于哪个项目,以防有 2 个项目具有相同的 id。

【问题讨论】:

  • 什么是 items_id?
  • 在食品示例中,一个订单可以有两个汉堡,还是单独的订单?
  • Item和SubItem的数量是无限的。
  • dba stackexchange 上的相关链接。 dba.stackexchange.com/questions/132970/…
  • @Drealler 有多少商品/子商品并不重要,我问的是一个订单是否可以有两次相同的商品。我得到的是可以订购两个汉堡(相同的项目),每个都有不同的浇头(子项目)。这意味着“Orders_SubItems”应该是“Order_Items_SubItems”,并且“Order_Items”应该有一个行 id 供其引用。

标签: php mysql database laravel model


【解决方案1】:

为什么这么复杂?

order 和 order_items 正是您所需要的。将 is_incredient (TINYINT) 或 is_extra (TINYINT) 列添加到 order_items 就是这样。

价格、名称和数量不必分开。

【讨论】:

  • 因为一个项目可以有无限的子项目,他们可以改变项目的价格。
【解决方案2】:

性能问题(取决于您的获取方式 - 急切/延迟加载)

数据库设计在 Laravel 上的性能不太重要,而在 Laravel 上实现你的设计(你将如何实现你的设计)很重要。如果你在 Laravel 中通过使用所有的性能指标正确地实现了任何复杂的模型,那么它当然与你在数据库端引入的复杂度或关系的数量无关。

我想建议您安装laravel debugbar 并根据不同的设计比较您的查询数量和性能。当你对 Laravel 调试栏有了足够的了解后,就可以实现 laravel 的缓存、索引技术了。 Laravel 性能调优的全新世界。

注意:数据库的设计和复杂性以某种方式决定了性能,但实际性能是您将如何在 Laravel 中实现它。

请看:

  • Laravel 调试栏
  • 急切加载与延迟加载(Eloquent)
  • 对象缓存、配置缓存
  • MySQL 索引
  • 优化命令(Artisan Ccommands)
  • 路由缓存
  • 数据库分块

你可以找到很多关于上述主题的教程,只是你需要搜索 Laravel 的性能。不要害怕使用 Laravel 引入任何复杂的模型(数据库设计)。这就是你将如何学习“如何优化”或“你真的需要切断任何模型”的方式。除非并且直到获得完整的需求规范文档(应用程序详细信息),否则没有人可以建议您最好的数据库设计。如果您根据 laravel 中可用的不同性能指标来设计您的应用程序,那就更好了。

我在响应您的性能查询和性能调整时发布此内容。

【讨论】:

    【解决方案3】:

    您的初始结构看起来非常好——我只是推荐一些简单的修改。

    要解决子项目,我建议对订单上的所有项目使用单一模型,只需添加一个 parent_id,然后在子项目上引用它。

    例如,让我们添加一个带有 items_id 1 和 null parent_id 的汉堡。然后,如果我们想添加一些美味的培根,它会变成 items_id 2 和 parent_id 1。额外的馅饼,同样的想法......这会变成 items_id 3 和 parent_id 1。这个结构的好处是你可以有基本上无限的子项目...以及您需要的任意多个级别。

    我还建议将价格添加到 order_items 模型中,以获取销售点价格。这样,如果商品价格发生变化(或者您有促销、优惠券、折扣等),您的历史数据将被保留。

    您可能还希望将所有货币字段(价格、总计等)转换为美分,并将它们作为整数存储在数据库中。这通常会为您提供更好的性能(超过 varchar),适用于所有主要货币,并避免小数数据类型可能出现的一些舍入问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-12
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多