我需要能够将subItems添加到我的订单系统。
我有这个结构:
该子项目就像是一道菜的另一种模式。
例如在汉堡中,如果客户想要添加生菜,番茄或洋葱。它还需要item_id来识别子项所属的那个订单项。
然后我最终得到了这个模型:
编辑:
答案 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的性能即可。不要害怕在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),适用于所有主要货币,并避免使用十进制数据类型时可能出现的一些舍入问题。