我正在尝试构建一个Java程序,为自己存储食谱。该程序应该能够存储,搜索和更改 食谱存储在数据库中。目前我正在使用Access 2003,因为我习惯了它,但我很可能以后会使用MySQL。
这里的问题很可能是非常基本的,但我遇到的问题是实现我的逻辑模型,我想知道如何解决这个问题,或者是否有更好的方法来解决这个问题。
所以这就是问题,这是一个具体的例子: 我想在数据库中存储成分,比如“胡萝卜”。 然而,许多项目都有替代名称,特别是因为我甚至不是英语所以: 我们假设胡萝卜是英文的胡萝卜。 现在Carrot用我的语言“Morot”。 也许以后我会看Jamie Oliver的节目,他把胡萝卜称为“shapdoodles”之类的东西。
我想存储这些成分的原因是因为如果我添加这三个食谱然后再搜索“胡萝卜”,我希望程序不仅列出涉及的食谱 胡萝卜,还有morot和shapdoodles,因为,它们也是胡萝卜,只是不同的名字!
这听起来很简单,起初我认为只有一个文本字段的表格“成分”就好了。 文本将是主键,它将存储成分名称,例如“carrot”或“shapdoodle”。 该表将与表“Ingredientlist”相关联,而Ingredientlist将导致“RecipeDescription”等等。
我假设我可以简单地添加另一个包含两个文本字段的表,name和alternatename,只需将Ingredient的textfield作为这两个文本字段的外键和 这两个文本域一起作为表的主键。 我有点想到这种结果:
AlernateIngredientTable:
carrot shapdoodle
carrot morot
等等......所以稍后我可以简单地发送查询来查找此表中与“胡萝卜”相关的所有内容,并从那里找到与胡萝卜或shapdoodles或morot相关的食谱。
好吧,既然我无法将相同的外键添加到表中的两个字段中,我有点丢失!
答案 0 :(得分:1)
您应该更改模型并创建一个表格,将一个成分与其所有名称相关联。 每种相当于胡萝卜的成分都会成为相同的ID。这是一个例子:
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
将食谱与其成分相关联的第3张表
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而不是成分名称运行查询。
如果我能帮助/解释更多,请告诉我。