这取决于您实际需要对系统执行的操作。需要跟踪库存的系统需要了解“组合餐”需要从库存中扣除一个热狗和 32 盎司苏打水(或其他)。然而,一个只记录订单和金额的系统并不真正关心“进入”套餐的内容——只关心你卖了一份并得到了报酬。
也就是说,假设您需要库存系统。您可以通过稍微更改定义来降低复杂性。考虑 (1) 库存项目和 (2) 菜单项目。您的inventory_items 表包含您作为库存购买和跟踪的项目(热狗、苏打水等)。您的 menu_items 表包含您销售的商品(Big Dog Combo Meal、Hot Dog(仅限三明治)等)。
您可以有一些菜单项,巧合的是,它们与库存项具有相同的名称,但是对于这些菜单项对待它们的方式与您使用组合项的方式相同,并将单个记录粘贴到链接表:
inventory_items menu_items recipes (menu_item, inventory, qty)
--------------- ------------ ----------
hot dog Hot Dog Hot Dog, hot dog, 1
hot dog bun Hamburger Hot Dog, hot dog bun, 1
hamburger patty (4oz) Big Dog Combo Hamburger, hamburger patty (4oz), 1
hamburger bun Soda (32oz) Hamburger, hamburger bun, 1
cola Big Dog Combo, hot dog, 1
ginger ale Big Dog Combo, hot dog bun, 1
Big Dog Combo, *soda, 32
Soda (32oz), *soda, 32
仅仅构建这个例子,事实证明即使是卑微的热狗也有两个组成部分(你必须数一下面包),而不仅仅是一个。为了提出最简单的情况(具有单个组件的菜单项),我将 Soda 添加到菜单中。但是,请考虑,如果您要盘点非食品(杯子),那么即使是简单的苏打水也将包含两个组件(如果您要盘点吸管,则三个组件)。
请注意,这种设计不会有用于处理组合项和非组合项的特殊代码路径。所有与菜单相关的功能将仅使用menu_items 表,所有与库存和食品准备相关的功能将JOIN menu_items 到recipes 和(如果需要其他字段)到inventory_items。
您需要对可选成分(酸菜、调味品、辣椒等)和可从不同库存项目中选择的成分(在此模型中表示为 *soda)进行特殊处理,但这应该可以帮助您入门。