没有分隔值的数据库结构

时间:2015-02-19 16:09:51

标签: database database-design android-sqlite

我正在创建一个管理食谱的应用程序,并希望将我的数据存储在数据库中。主要问题是创建适当的数据库结构。

程序中我的对象的结构是:

 ________________________________
|Recipe                          |
|--------------------------------|
|-String recipeName;             |
|-List<Ingredient> ingredients;  |
|-List<String> methodSteps;      |
|________________________________|
 ___________________________
|Ingredient                 |
|---------------------------|
|-String ingredientName;    |
|-Float ingredientAmount;   |
|-String ingredientUnit;    |
|___________________________|

程序存储一个List。每个食谱可以包含用户希望的成分和方法步骤,并且两者都必须大于0并包含有效数据。

我无法弄清楚如何创建一个符合第一范式的有效数据库,因为我不想在数据库中保留逗号分隔值。有很多信息说不要在我同意的记录中使用CSV,只是没有专业知识来实现​​我想要的(或者不知道关键搜索词来查找信息我需要)。

如何将其转换为数据库结构? (可以添加一些关键值以正确实现数据库。

最终,这将作为Android应用程序运行,因此将使用SQLite在Java代码中管理它。

感谢您提供的任何帮助!

1 个答案:

答案 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汤匙”或者不管是多少杯。