没有定界值的数据库结构

Database Structure without Delimited Values

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

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

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

程序存储了一个List。每个 Recipe 可以有用户希望的任意数量的成分和 methodSteps,两者都必须大于 0 并包含有效数据。

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

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

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

感谢您提供的任何帮助!

不在数据库中放置逗号分隔值的分数 table。

这真的很简单:当有多个 X 与给定的 Y 对应时,您创建两个 table,一个用于 X,一个用于 Y。然后每个 X 必须有一个引用来绑定它到 Y.

在这种情况下,您应该首先考虑 3 tables:

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 上放了一个 "sequence",因为我认为这些步骤必须按正确的顺序完成。然后

select sequence, text from methodstep where recipe_id=? order by sequence

我会更进一步,为度量单位创建一个单独的 table。喜欢

Unit
  unit_id
  name

然后,您可以将 unit_id 放入每个成分记录中,而不是放入单位名称。这样做的好处是,(a) 它为您提供了所有单位名称的标准化拼写,并且 (b) 您现在可以将有关该单位的其他信息添加到单位 table,而不必在每种成分中重复该信息记录。就像你可以给出公制等价物一样。或者记录与其他单位的关系,例如 table 勺子中有多少茶匙。然后,如果你想改变数量,你可以让程序自动乘以并调整单位,比如不要说“30 茶匙”,而是说“10 table 勺子”或者不管多少杯等等。