2

我正在尝试创建一个数据库来存储我的食谱。但是,我不确定如何实现它。我看了其他类似的问题,但它们的重点与我不同。

我认为任何菜肴实际上只是一种成分,然后可以用于其他菜肴,或者在这种情况下用于其他成分。任何成分都可能有多个配方。目前,每个食谱都表明每种成分需要多少,但我也想知道这些成分是如何组合的,而没有长篇大论的文字描述。

例如,在文本中,我会描述一个(非常糟糕的)炒鸡蛋食谱,如下所示:

Scrambled eggs:
    Cooked for 5 minutes(
        1g Butter,
        Whisked(
            1g Salt,
            1g Pepper,
            2 Eggs
    )

然后Scrambled eggs可以在另一个食谱中用作成分。

但是这将如何在数据库中翻译?我不需要该数据库是基于 SQL 的,因为这是一个个人项目,但到目前为止我不知道任何其他类型的数据库。

我考虑过将Ingredient, 定义为具有Technique与之关联的可选项,但这意味着Whisked(1g salt, 1g pepper, 2 eggs)必须是Ingredient. 我想这可行,我也可以选择成分的名称,但这似乎很尴尬。

我还考虑过将 a 定义Recipe为具有 multiple TransformedIngredients,其中包含Technique应用于许多的 a,Ingredients但有时 aRecipe包含原始的、未转换的,Ingredients有时TransformedIngredients需要应用于TransformedIngredient. 据我所知,无法使用的数据库。

PS:我偶然发现了一个函数式编程提拉米苏食谱,虽然它非常关注技术,但很好地展示了我试图为我的数据库实现的内容。

4

2 回答 2

2

您可以向表中添加一些其他字段,但我相信此架构适合您。

recipe
------------
r_id PK
recipe_name
cooking_time

recipe_of_recipes
-----------------
ror_id   PK
ror_name

recipe_ror (table for many to many relation-> defining a recipe as an ingredient)
-------------
r_ror_id PK
r_id     FK
ror_id   FK

ingredients
-------------
i_id     PK
t_id     FK
r_id     FK
ror_id   FK (added later)
ingredient_name
quantity

technique
-------------
t_id   PK
technique_name

编辑

假设您要存储一个配方 (X),它是 x 和 y 配方加上 z 成分的组合。

准备 X 食谱(大 X),

in recipeingredients以及technique您存储的表

  • x 配方和 w,t,r 成分与 p 技术
  • y 配方和 b,n,m 成分与 v 技术
  • 还采用 f 技术的 z 成分(为此,我忘记在成分表中添加字段 ror_id 作为 FK)

recipe_ror您可以使用该表将 2 个不同的配方(x 和 y)定义为配方 (X) 的成分。recipe该表与不同的食谱为一体。(表和之间的多对多关系recipe_of_recipes

如果您还想存储 X、x 或 y 食谱的技术(如示例中的厨师),您还可以将t_id字段作为 FK 添加到reciperecipe_of_recipes中。

于 2019-04-11T20:34:42.407 回答
2

我认为令人困惑的是,一个食谱需要考虑两种不同的事情,“项目”和“步骤”。

为此想到的一种数据库结构是星型模式结构,它将这些想法很好地分开(分别为表格DimensionFact表格)。

每个的简要说明:

  • 方面

    • “事物的状态”,即记录只是用来描述事物是什么。客户的地址表就是维度表的一个示例。
  • 事实

    • “随时间变化的事物”,即每条记录都与一个维度表相关,但具有不断变化的值。例如,将购买的商品从网站运送到客户的地址。地址保持不变,但货物不断添加到表中。

这并不是说维度表也不会改变。显然,新用户一直在注册网站。在上面的地址示例中,如果客户要更改其地址,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桌子。这样您就可以轻松制作更复杂的食谱,例如“鸡蛋和煎饼早餐”,其中鸡蛋部分是此食谱的结果。

于 2019-04-11T20:37:03.917 回答