- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试创建一个数据库来存储我的食谱。但是,我不确定如何实现它。我看了其他类似的问题,但它们的重点与我不同。
我假设任何菜肴实际上都只是一种配料,然后可以将其用于其他菜肴,或者在这种情况下用于其他配料。任何成分都可能有多个配方。现在,每个食谱都指出每种成分需要多少,但我也想知道这些成分是如何组合的,而无需对其进行长篇文字描述。
例如,在文本中,我会像这样描述一个(非常糟糕的)炒鸡蛋食谱:
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
,其中包含应用于许多 Ingredients
的 Technique
> 但有时 Recipe
包含原始的、未转换的 Ingredients
,有时 TransformedIngredients
需要应用于 TransformedIngredient
。据我所知,数据库无法正常工作。
PS:我偶然发现了一个 functional programming Tiramisu recipe虽然非常注重技术,但它很好地展示了我试图为我的数据库实现的内容。
最佳答案
我认为令人困惑的是,对于菜谱,有两种不同的东西需要考虑,“项目”和“步骤”。
为此想到的一个数据库结构是 Star Schema structure很好地将这些想法分开(分别分为 Dimension
和 Fact
表)。
每个的快速描述:
维度
事实
这并不是说维度表也不会改变;显然新用户一直在注册网站。在上面的地址示例中,如果客户要更改他的地址,一个新的 primary key
将为新地址增加值(value)。
假设您正在做饭。我会把你手里拿着的任何东西都放在“维度”表中。例如:DIM_INGREDIENT
(包含诸如 INDREDIENT_ID
、 INGREDIENT_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/
我会发布我所有的代码。目前我有一个带有适配器和生成 ListView 的数据源的 Activity 。然后,您选择菜谱,它使用单独的适配器将其发送到另一个 Activity 。我希望此 Activit
最近工作中需要 python 命令行实用程序,但我没有编写 cli 的经验。无论如何,我仍然必须将它们弹出。 我最大的障碍是这些程序的结构。此外,获取和验证用户输入的方法。我一直以非常长的 while
假设我有一个食谱数据库,我想根据我拥有的成分搜索它们。 应该有 3 个表: 食谱(rid,rname), 配料(iid,iname), 关系(rid,iid) 接下来,假设我有一个“ toast ”食
我正在写一个自定义yocto recipe应该从.whl安装一个python包文件。 我尝试使用包含以下内容的食谱: inherit pypi setuptools PYPI_SRC_URI="htt
我想弄清楚如何创建一个从 git 下载并使用 make 文件构建的食谱。例如: g3logger (git https://github.com/KjellKod/g3log.git) 食谱“bb”文
在 Scala 食谱中:13.3。如何在 Actor 之间进行交流我看到了这个 class Ping(pong: ActorRef) extends Actor { // OMG - ActorRef
我可以在食谱中看到以下内容 task "create-dirs" set.allSource.srcDirs.each {it.mkdirs()} } } 关于其他插件的 G
C 文件 int main() { printf("Hello, World!\n"); return 0; } helloworld.bb DESCRIPTION =
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
当我使用/bin/sh 时,我可以简单地通过回显来通过 bash 发出命令 vagrant@vagrant:~$ sh $ echo 'ls' | bash some.sh 但是当我尝试使用这个命令时
我是一名优秀的程序员,十分优秀!