gpt4 book ai didi

database - 食谱数据库设计

转载 作者:搜寻专家 更新时间:2023-10-30 20:07:38 27 4
gpt4 key购买 nike

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

我假设任何菜肴实际上都只是一种配料,然后可以将其用于其他菜肴,或者在这种情况下用于其他配料。任何成分都可能有多个配方。现在,每个食谱都指出每种成分需要多少,但我也想知道这些成分是如何组合的,而无需对其进行长篇文字描述。

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

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

然后 炒鸡蛋 可以在另一个食谱中用作配料。

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

我想过定义一个Ingredient,因为它有一个可选的Technique与之相关联,但这意味着Whisked(1g salt, 1g pepper, 2 eggs) 必须是 Ingredient。我想这可行,我也可以将成分的名称设为可选,但这看起来很尴尬。

我还考虑过将 Recipe 定义为具有多个 TransformedIngredients,其中包含应用于许多 IngredientsTechnique > 但有时 Recipe 包含原始的、未转换的 Ingredients,有时 TransformedIngredients 需要应用于 TransformedIngredient。据我所知,数据库无法正常工作。

PS:我偶然发现了一个 functional programming Tiramisu recipe虽然非常注重技术,但它很好地展示了我试图为我的数据库实现的内容。

最佳答案

我认为令人困惑的是,对于菜谱,有两种不同的东西需要考虑,“项目”和“步骤”。

为此想到的一个数据库结构是 Star Schema structure很好地将这些想法分开(分别分为 DimensionFact 表)。

每个的快速描述:

  • 维度

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

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

这并不是说维度表也不会改变;显然新用户一直在注册网站。在上面的地址示例中,如果客户要更改他的地址,一个新的 primary key将为新地址增加值(value)。

现在开始您的食谱示例:

假设您正在做饭。我会把你手里拿着的任何东西都放在“维度”表中。例如:DIM_INGREDIENT (包含诸如 INDREDIENT_IDINGREDIENT_NAME 等列)和 DIM_AMOUNT ( AMOUNT_ID , AMOUNT , UNITS ) 来描述金额。和 DIM_ACTION ( ACTION_ID , TYPE , LENGTH , UNITS ) 来描述操作。您可以想出更多;这些是一些入门。

我将采取的任何步骤都可以在 FACT_RECIPE_STEPS 中进行将映射到所有维度表的表。任何没有逻辑步骤的步骤都会有一个 null值(即搅拌 5 分钟对于 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 中的一行表。

现在我考虑得更多了,在 FACT_RECIPE_STEPS 中将“Whisked”指定为其自己的配方可能会更好。和 DIM_INGREDIENT (称为“鸡蛋搅拌香料”之类的东西)+并摆脱 FACT_ACTION_STEP表一共。这样您就可以轻松制作更复杂的食谱,例如“鸡蛋和煎饼早餐”,其中鸡蛋部分就是该食谱的结果。

关于database - 食谱数据库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55639655/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com