数据库设计 - 存储序列

时间:2013-05-28 07:37:21

标签: database sqlite sequence

想象一下:有一个“配方”表和一个“配方步骤”表。我们的想法是允许在不同的配方中重用不同的配方步骤。我遇到的问题是,在配方上下文中, recipe-steps 显示的顺序很重要,即使它不遵循 recipe-step 表主键顺序,因为此顺序将由用户设置。

我在想做类似的事情:

recipe-step table:

id | stepName | stepDescription
-------------------------------
1  | step1    | description1
2  | step2    | description2
3  | step3    | description3
...


recipe table:

recipeId | step
---------------
1        | 1
1        | 2
1        | 3
...

这样,步骤列中显示的步骤顺序就是我需要维护的顺序。

我对这种方法的担忧是:

  • 如果我必须在两个现有步骤之间添加新步骤,我该如何查询?如果我只需要按顺序切换两个步骤的顺序怎么办?
  • 如何确保订单保持一致性?如果我只是在 recipe 表中插入或更新某些内容,它会在表格的末尾弹出,对吧?

你还有其他想法吗?我还想过在 recipe-step 表中有上一步下一步列,但我认为它会更多很难让配方步骤以这种方式重复使用。

1 个答案:

答案 0 :(得分:2)

在SQL中,表有序。 除非您使用ORDER BY子句,否则允许数据库引擎以他们认为最快的任何顺序返回记录(例如,覆盖索引可能具有不同顺序的数据,并且有时甚至SQLite会自动创建临时覆盖索引。

如果步骤在特定配方中具有特定顺序,则必须将此信息存储在数据库中。

我建议将其添加到recipe表中:

recipeId | step | stepOrder
---------------------------
1        | 1    | 1
1        | 2    | 2
1        | 3    | 3
2        | 4    | 1
2        | 2    | 2

注意: recipe表存储配方和步骤之间的关系,因此应将其称为recipe-steprecipe-step表是独立的食谱,因此应该称为step。 您可能需要一个存储与步骤无关的配方信息的表; 表应调用recipe