将项目和子项插入订单

时间:2018-05-04 16:24:22

标签: php mysql database laravel model

我需要能够将subItems添加到我的订单系统。

我有这个结构:

enter image description here

该子项目就像是一道菜的另一种模式。

例如在汉堡中,如果客户想要添加生菜,番茄或洋葱。它还需要item_id来识别子项所属的那个订单项。

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

Fixed Model

  • 这是最好的方法吗?
  • 查询时我是否会遇到性能问题?

编辑:

  1. Order_SubItems中item_id的原因是引用子项所属的Item_id。
  2. 相同的订单可以包含多个具有相同ID的商品。但是他们每个SubItem只能有一种类型。
  3. 也许我需要一个item_pos列来了解子项目所属的项目,以便有2个具有相同ID的项目。

3 个答案:

答案 0 :(得分:0)

为什么这么复杂?

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

没有必要分开价格,名称和数量。

答案 1 :(得分:0)

性能问题(取决于您如何获取 - 急切/延迟加载)

数据库设计在Laravel上的性能不太重要,而在Laravel上实现您的设计(如何实现您的设计)非常重要。如果您通过利用所有性能度量正确地在Laravel中实现任何复杂模型,那么当然,无论您在数据库端引入多少复杂或多少关系都无关紧要。

我建议您安装laravel debugbar并根据不同的设计比较您的查询次数和效果。当你对Laravel调试栏有足够的想法,然后实现laravel的缓存,索引技术。有一个全新的Laravel性能调整世界。

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

请看:

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

您可以找到有关上述主题的大量教程,只需搜索Laravel的性能即可。不要害怕在Laravel中引入任何复杂的模型(数据库设计)。这就是你要学习的方式"如何优化"或者"你真的需要切断任何型号"。除非获得完整的需求规范文档(App Detail),否则没有人可以建议您使用最好的数据库设计。如果您根据laravel中提供的不同性能指标设计应用程序,效果会更好。

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

答案 2 :(得分:0)

您的初始结构看起来非常好 - 我只是建议一些简单的修改。

要解决这些子项目,我建议只需添加一个parent_id,然后在子项目上引用该项目,就可以为订单上的所有项目使用单一模型。

例如,让我们添加一个带有items_id 1和null parent_id的汉堡。然后,如果我们想要添加一些美味的培根,它将成为带有parent_id 1的items_id 2.额外的patty,相同的想法...使用parent_id 1成为items_id 3.关于这个结构的好处是,你可以拥有基本上无限的子项......以及你需要的多层次。

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

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