1

我正在尝试构建一个为自己存储食物食谱的 Java 程序。该程序应该能够存储、搜索和更改存储在数据库中的食谱。目前我正在使用 Access 2003,因为我已经习惯了它,但我很可能稍后会使用 MySQL。

这里的问题很可能是非常基本的,但我遇到的问题是实现我的逻辑模型,我想知道如何解决这个问题,或者是否有更好的方法来做到这一点。

所以事情就是这样,这是一个具体的例子:我想在数据库中存储成分,比如“胡萝卜”。然而,许多项目都有替代名称,特别是因为我什至不是英语所以:假设 Carrot 是英语中的 Carrot。现在,Carrot 在我的语言中是“Morot”。也许稍后我看杰米奥利弗的节目,他把胡萝卜叫做“shapdoodles”之类的东西。

我想存储这些成分的原因是因为如果我添加这三个食谱,然后在搜索“胡萝卜”时,我希望程序不仅列出涉及胡萝卜的食谱,还列出 morot 和 shapdoodles,因为它们也是胡萝卜,只是名称不同!

这听起来很简单,起初我认为这就像拥有一个带有一个文本字段的“成分”表一样简单。该文本将是一个主键,它将存储成分名称,例如“carrot”或“shapdoodle”。该表将与表“Ingredientlist”连接,而 Ingredientlist 将导致“RecipeDescription”等。

我假设我可以简单地添加另一个带有两个文本字段(名称和备用名称)的表,并将成分的文本字段作为这两个文本字段的外键,这两个文本字段一起用作表的主键。我有点想这样的结果:

AlernateIngredientTable:
carrot  shapdoodle
carrot morot

依此类推……因此,稍后我可以简单地发送查询以查找此表中与“胡萝卜”相关的所有内容,然后从那里找到与胡萝卜、shapdoodles 或 morot 相关的食谱。

好吧,由于我无法将相同的外键添加到表中的两个字段,我有点迷路了!

4

1 回答 1

1

您应该更改您的模型并创建一个将成分与其所有名称相关联的表。与胡萝卜等效的每种成分都将具有相同的标识。这是一个例子:

table Ingredient(id, name)

id    Name
---------------
1    carrot
1    shapdoodle
1    morot
2    potato
2    patata
3    sugar
3    brownsugar
3    anothernameforSugar

还有一张食谱表:

table recipe(id, name, preparation_time)
1    carrot cake    45

将食谱与其成分相关联的第三张表

table recipeToIngredient(recipeId, ingredientId)
1    1
1    3

在这个例子中,我定义了一个 ID 为 1 的“胡萝卜蛋糕食谱” 这个食谱有 2 种成分:胡萝卜(表“成分”中的 ID 1)和糖(ID 3)

要检索所有涉及胡萝卜/morots/etc 的食谱:

SELECT recipe.name FROM recipeToIngredient, recipe
WHERE recipeToIngredient.recipeId=recipe.id
AND ingredient.id = recipeToIngredient.ingredientId 
AND recipeToIngredient.ingredientId = (SELECT id FROM ingredients WHERE name'carrot')

基本上,我们在这里所做的是为成分放置一个“id”字段,而不是使用成分名称作为主键的模型。这样,虽然名称会根据语言而变化,但给定成分的 id 始终相同,并且您可以根据 id 而不是成分名称运行查询。

让我知道我是否可以提供更多帮助/解释。

于 2012-10-06T14:21:04.530 回答