我需要对数据库做出设计决定。要求是一个数据库表有一个名为id的AUTO_INCREMENT PRIMARY KEY字段。默认情况下,每一行都按id升序显示给用户(在 web 中) 。例如,如果表中有 4 条记录。UI 将按0、1、2、3的顺序显示行。
现在,要求用户可以在 UI 中拖放行以更改顺序。比如说,用户将 rom 3 拖放到 0 之前。因此,显示顺序变为3, 0, 1, 2。这个序列应该持久化到数据库中。
我想知道如何设计数据库表以使其持久化和可扩展。我的第一个想法是每一行都有一个“序列”字段指示显示顺序。默认情况下,该值应与id相同。从数据库中选择数据进行显示时,行按顺序而不是id 升序排序。
如果序列发生变化,则将其更新为新值。结果是它可能涉及到其他行的大量更改。以上面的例子,最初的表格是这样的:
|id | sequence |
|0 | 0 |
|1 | 1 |
|2 | 2 |
|3 | 3 |
现在,将 id 为 3 的行拖到第一个。它的序列被更新为0。同时,id为0、1、2的行也应该被更新。
|id | sequence |
|0 | 1 |
|1 | 2 |
|2 | 3 |
|3 | 0 |
恐怕这种方法会使重新排序花费大量资源并且不可扩展。所以,我想这个序列可以通过将id乘以K(比如 10)来初始化。这会在插入的序列值之间留下间隙。但是,如果将 K+1 行移至此间隙,则该间隙仍会耗尽。
|id | sequence |
|0 | 0 |
|1 | 10 |
|2 | 20 |
|3 | 30 |
这似乎是数据库设计的一个常见问题。有人有更好的主意来实现这一目标吗?