如何在Sequelize中计算订单总价?是否需在关联表添加价格字段?
要不要在OrderProducts表中添加price字段?
答案是没必要非得加,得看你的业务需求来选,两种方案各有优劣:
1. 不加price字段的做法
完全可以通过关联查询直接算出单商品总价和订单总价:
- 单商品总价直接用
Products.price * OrderProducts.quantity计算 - 订单总价可以关联三张表求和,SQL示例:
SELECT o.orderId, SUM(p.price * op.quantity) AS totalprice FROM Orders o JOIN OrderProducts op ON o.orderId = op.orderId JOIN Products p ON op.productId = p.productId GROUP BY o.orderId;
这种方式的好处:
- 数据不会乱:商品价格只存在Products表里,不会出现同一件商品在不同订单记录里价格不一样的情况,避免冗余和错误
- 维护省心:改商品价格时只动Products表就行,不用去改一堆历史订单记录
坏处就是查询得多关联一张表,数据量大的时候可能慢一点,但加索引基本能解决。
2. 加price字段的做法
如果你的业务要求订单创建后,商品涨价降价都不影响这个订单的总价(这是大多数电商的正常逻辑,用户下单时的价就是最终价),那建议在OrderProducts里加个unit_price字段(别直接叫price,避免和Products的字段混),存下单时的商品单价。
这种方式的好处:
- 历史订单价格锁死:后续商品调价和之前的订单没关系,符合用户认知
- 查询更快:算订单总价不用关联Products表,直接用
unit_price * quantity求和就行
坏处就是有数据冗余,同一件商品的价格会在多个OrderProducts记录里重复存,而且得确保下单时把当时的单价正确写进去,这个逻辑不能出错。
总结
- 要是不需要保留历史订单的原价,优先选不加字段的方案,保数据一致
- 要是需要固定历史订单的价格(绝大多数场景都需要),就加个
unit_price字段存下单时的单价
内容的提问来源于stack exchange,提问作者Mehmet Baki
相关产品推荐
相关产品推荐

