这取决于您实际需要如何处理您的系统。需要跟踪库存的系统需要了解,“组合餐”需要通过一个热狗和32盎司苏打(或其他)来清点库存。然而,一个只追踪订单和美元的系统并不真正在意组合餐会有什么“进入” - 只有你卖掉了一个并获得了报酬。
也就是说,假设您需要库存系统。您可以通过稍微改变您的定义来降低复杂性。考虑(1)库存物品和(2)菜单项。您的inventory_items表格包含您购买并追踪为库存的物品(热狗,苏打水等)。您的menu_items表格包含您销售的物品(Big Dog Combo Meal,热狗(仅限三明治)等)。
你可以有,巧合的是,具有相同的名称作为库存项目,但对于对待他们,你做一个组合项目以同样的方式,坚持一个记录插入链接表这些菜单项的一些菜单项:
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
只是构建这个例子,事实证明,即使是低热狗也有两个组件(你必须计算发髻),而不仅仅是一个。为了提出最简单的情况(一个单一组件的菜单项),我在菜单中添加了苏打水。但是,考虑一下,如果你打算清点非食品物品(杯子),那么即使是一个简单的苏打水也会有两个组件(三个如果你正在清理吸管)。
请注意,使用此设计,将不会有处理组合项目和非组合项目的特殊代码路径。所有与菜单相关的功能将只使用menu_items
表格,所有库存和食物准备相关功能将JOIN
menu_items
到recipes
和(如果需要额外的字段)到inventory_items
。
您需要对可选组件(酸菜,津津有味,辣椒等)以及可以从不同库存项目中选择的组件(在此模型中表示为苏打)进行特殊处理,但这会让您开始。
嗨拉里,我还在想你的解决方案。我试图解决的问题实际上并不仅仅是食物。它也可能是其他项目。我试图分析你的解决方案,看它是否足够满足我需要的。 – StackOverflowNewbie
我在做销售时记录什么?我是否存储对'menu_items'的PK的引用?如果是这样,那意味着一旦出售该特定物品,我就需要保留该记录以用于历史目的。这样我就知道出售menu_item的“热狗”实际上意味着热狗和热狗包子。如果该menu_item稍后被编辑(例如,意味着热狗,热狗包,芥末),那么该编辑应该实际上导致在menu_item的表中创建新的条目。 – StackOverflowNewbie
或者,我可以在销售记录中存储menu_item的热狗通过复制'recipes'中的相关记录来表示的意思。如果热狗的意思后来改变,那很好。这意味着什么已经存储在销售记录中。我想我不应该允许一个menu_item的硬销售一旦出售(再次保存历史数据);我只是为它设置一个标志。思考? – StackOverflowNewbie