我认为令人困惑的是,一个食谱需要考虑两种不同的事情,“项目”和“步骤”。
为此想到的一种数据库结构是星型模式结构,它将这些想法很好地分开(分别为表格Dimension和Fact表格)。
每个的简要说明:
方面
- “事物的状态”,即记录只是用来描述事物是什么。客户的地址表就是维度表的一个示例。
事实
- “随时间变化的事物”,即每条记录都与一个维度表相关,但具有不断变化的值。例如,将购买的商品从网站运送到客户的地址。地址保持不变,但货物不断添加到表中。
这并不是说维度表也不会改变。显然,新用户一直在注册网站。在上面的地址示例中,如果客户要更改其地址,primary key则会为新地址添加一个新值。
现在到你的食谱例子:
想象一下,你正在做饭。我会把你手中的任何东西放在一个“维度”表中。例如:(DIM_INGREDIENT带有INDREDIENT_ID, INGREDIENT_NAME)和DIM_AMOUNT( AMOUNT_ID, AMOUNT, UNITS) 等列来描述金额。和DIM_ACTION( ACTION_ID, TYPE, LENGTH, UNITS) 来描述动作。你可以想出更多;这些是一些入门的。
我将采取的任何步骤都可以放在一个FACT_RECIPE_STEPS映射到所有维度表的表中。任何没有逻辑步骤的步骤都将有一个null值(即搅拌 5 分钟将具有 null for INGREDIENT_ID)。
FACT_RECIPE_STEPS可能看起来像这样:
RECIPE_ID, RECIPE_STEP, ACTION_STEP_ID, INGREDIENT_ID, AMOUNT_ID,ACTION_ID
令人困惑的是将这些东西搅拌在一起的“子步骤”。我把它放在另一个FACT叫做“搅拌”的表中,FCT_ACTION_STEP因为“搅拌”是食谱列表中的一个动作,但要执行这个动作,你实际上需要做三件事。
我认为以下是您的数据中某些表格的样子:
DIM_INGREDIENT
INGREDIENT_ID: 1
INGREDIENT_NAME: 'Scrambled eggs'
INGREDIENT_ID: 2
INGREDIENT_NAME: 'Salt'
INGREDIENT_ID: 3
INGREDIENT_NAME: 'Pepper'
INGREDIENT_ID: 4
INGREDIENT_NAME: 'Eggs'
INGREDIENT_ID: 5
INGREDIENT_NAME: 'Butter'
DIM_ACTION
ACTION_ID: 1
TYPE: 'Cook'
LENGTH: 5
UNITS: 'minutes'
ACTION_ID: 2
TYPE: 'Whisk'
LENGTH: null
UNITS: null
FCT_ACTION_STEP
STEP_ID: 1
ACTION_ID: 2
DIM_AMOUNT
AMOUNT_ID: 1
AMOUNT: 1
UNITS: 'grams'
AMOUNT_ID: 2
AMOUNT: 2
UNITS: null
FACT_RECIPE_STEPS
RECIPE_ID, RECIPE_STEP, ACTION_STEP_ID, INGREDIENT_ID, AMOUNT_ID, ACTION_ID
编辑:
我有点不确定自己如何做配方中的“搅拌”部分,并认为,当你将搅拌过的混合物添加到最终结果中时,就像在配方中添加一种成分一样。但是,您需要先准备混合物,它分为三个步骤。它基本上就像它自己的小食谱,并且FACT_ACTION_STEP考虑到其他“食谱”以便能够将结果添加到FACT_RECIPE_STEPS表格中的一行。
现在我考虑得更多,最好将“Whisked”指定为它自己的食谱,FACT_RECIPE_STEPS并且DIM_INGREDIENT(称为“鸡蛋用Whisked香料”之类的东西)+并完全摆脱FACT_ACTION_STEP桌子。这样您就可以轻松制作更复杂的食谱,例如“鸡蛋和煎饼早餐”,其中鸡蛋部分是此食谱的结果。