将项目和子项目插入订单
Posted
技术标签:
【中文标题】将项目和子项目插入订单【英文标题】:Inserting Items and SubItems to a Order 【发布时间】:2018-10-15 04:52:19 【问题描述】:我需要能够将子项目添加到我的订单系统。
我有这个结构:
子项就像是一道菜的附加模型。
例如在汉堡中,以防客户想要添加生菜、番茄或洋葱。它还需要 item_id 来标识子项属于该订单的哪个项。
然后我最终得到了这个模型:
Fixed Model
这是最好的方法吗? 查询时会不会出现性能问题?编辑:
-
Order_SubItems中item_id的原因是引用了子item所属的Item_id。
同一订单可以有多个相同 ID 的商品。但是每个子项只能有一种类型。
也许我需要一个 item_pos 列来知道子项目属于哪个项目,以防有 2 个项目具有相同的 id。
【问题讨论】:
什么是 items_id? 在食品示例中,一个订单可以有两个汉堡,还是单独的订单? Item和SubItem的数量是无限的。 dba stackexchange 上的相关链接。 dba.stackexchange.com/questions/132970/… @Drealler 有多少商品/子商品并不重要,我问的是一个订单是否可以有两次相同的商品。我得到的是可以订购两个汉堡(相同的项目),每个都有不同的浇头(子项目)。这意味着“Orders_SubItems”应该是“Order_Items_SubItems”,并且“Order_Items”应该有一个行 id 供其引用。 【参考方案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),适用于所有主要货币,并避免小数数据类型可能出现的一些舍入问题。
【讨论】:
以上是关于将项目和子项目插入订单的主要内容,如果未能解决你的问题,请参考以下文章