我正在创建一个管理食谱的应用程序,并希望将我的数据存储在数据库中。主要问题是创建适当的数据库结构。
程序中我的对象的结构是:
________________________________
|Recipe |
|--------------------------------|
|-String recipeName; |
|-List<Ingredient> ingredients; |
|-List<String> methodSteps; |
|________________________________|
___________________________
|Ingredient |
|---------------------------|
|-String ingredientName; |
|-Float ingredientAmount; |
|-String ingredientUnit; |
|___________________________|
程序存储一个List。每个食谱可以包含用户希望的成分和方法步骤,并且两者都必须大于0并包含有效数据。
我无法弄清楚如何创建一个符合第一范式的有效数据库,因为我不想在数据库中保留逗号分隔值。有很多信息说不要在我同意的记录中使用CSV,只是没有专业知识来实现我想要的(或者不知道关键搜索词来查找信息我需要)。
如何将其转换为数据库结构? (可以添加一些关键值以正确实现数据库。
最终,这将作为Android应用程序运行,因此将使用SQLite在Java代码中管理它。
感谢您提供的任何帮助!
答案 0 :(得分:0)
不将逗号分隔值放在db表中的要点。
这非常简单:当有多个X与给定的Y一起使用时,你创建两个表,一个用于X,一个用于Y.然后每个X必须有一个引用,将它与Y绑定。
在这种情况下,您应该首先考虑3个表:
Recipe
recipe_id (probably an auto-assigned sequential number)
name
Ingredient
ingredient_id
recipe_id
name
amount
unit
MethodStep
methodstep_id
recipe_id
sequence
text
请注意,Ingredient和MethodStep都包含recipe_id,因此您可以将每个返回到它们所属的配方。你可以通过像
这样的查询获得给定食谱的所有成分select name, amount, unit from ingredient where recipe_id=?
哪里“?”将替换为相应的配方编号。
我在MethodStep上放了一个“序列”,因为我认为步骤必须以正确的顺序完成。然后
select sequence, text from methodstep where recipe_id=? order by sequence
我还要再做一步,为度量单位创建一个单独的表。像
Unit
unit_id
name
然后,不是将单位的名称放在每个成分记录中,而是放置unit_id。这样做的好处是,(a)它为您提供了所有单位名称的标准化拼写,以及(b)您现在可以将有关单位的其他信息添加到单位表中,而无需在每个成分记录中重复该信息。就像你可以给出公制等价物。或记录与其他单位的关系,例如一汤匙中的茶匙数量。然后,如果你想改变数量,你可以让程序自动繁殖并调整单位,而不是说“30茶匙”说“10汤匙”或者不管是多少杯。