数据库设计 – 存储序列

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

我在想做类似的事情:

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
...

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

我对这种方法的担忧是:

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

还有其他方法你会想到这样做吗?我还想过在配方步骤表中有一个前一步和下一步的列,但我认为以这种方式重复使用配方步骤会更困难.

最佳答案 在SQL中,表不是有序的.

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

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

我建议将其添加到配方表中:

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

注意:
配方表存储配方和步骤之间的关系,因此应将其称为配方步骤.
配方步骤表与配方无关,因此应将其称为步骤.
您可能需要一个存储与步骤无关的配方信息的表;这个表应该叫做食谱.

点赞