数据表的结构设计问题

现有几张表如下,一张表为dishes菜单表,结构为

id name price

一张表为orders订单表,结构为

id dish_id num ...

一张表为tablewares餐具表,结构为

id name price

一张表为order_dishes表,结构为

id order_id dish_id

需求:用户在app界面需要选择该菜的餐具(每种菜所用有的餐具可能不同),所以就设计了一张dish_tablewares表,用来对应dishestableware的关系,当用户下单后,订单里面不同的菜所选择的餐具该怎么存储。order_dish_tablewares用来存储订单餐具之间的关系,结构是这样的

id order_id dish_id tableware_id

但是这样岂不是一张表关联了三张表,而且用ORM取出相关数据的时候也是麻烦的厉害啊,百思不得解,遂来发帖求大大们帮助!!

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 5
Summer

这个时候,你需要了解下 Laravel Eloquent 的: 远层一对多

7年前 评论
Summer

熊仔,问题问的很专业啊 :sunglasses:

7年前 评论

@Summer 问题解决啦,谢谢站长。:laughing: 每次一有问题想不通就跑来发帖了,一般都是在晚上发帖,这样在睡一觉起来就能看到站长大人给我解决方案了。 太感谢本站了。已经成了生活的一部分:lips:

7年前 评论
TimJuly

首先说一个大的原则,涉及到钱的东西一定不要嫌麻烦.

如果按你上述设计的表结构,使用 Eloquent 进行查询并不复杂,你的order_dish_tablewares表需要增加一个order_dishes的 id 用于查询.
这样使用如下方式就可以直接查询了

Order::with('dish.tableware')->find('order_id');

另外,你with到原始商品表(例如 dishes)去查询,有一个非常大的隐患,就是原始商品可能发生变更,名称和价格都有可能修改(不要听信产品经理说的不会变更),这样已经下单的用户在查看订单的时候就会发现跟他购买的时候不一样了,到时候你就说不清楚了,解决办法就是把商品中的数据在 order 表中需要再存一遍.
所以你的订单明细表可能变成这样

order_dishes
{id,order_id,dish_id,商品名称,原始单价,优惠单价(实际该支付单价),优惠原因,数量,实际应支付总价,扩展信息(把 dishes 表中的所有数据再存一遍,方便以后核查数据)}
order_dish_tablewares
{id,order_dish_id,order_id,dish_id,tableware_id,其余同理}
7年前 评论

@TimJuly 学习了,很详细的方案。非常感谢!:100:

7年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!