如何设计可重新排序的表?

Mor*_*eng 8 database sorting sequence

我需要做一个关于数据库的设计决策.要求是一个数据库表具有名为idAUTO_INCREMENT PRIMARY KEY字段.默认情况下,每行显示给用户(在Web中)按ID排序.例如,如果表中有4条记录.UI将按0,1,2,3的顺序显示行.

现在,要求用户可以在UI中拖放行来改变顺序.说,用户拖动ROM 3和befow 0,所以,显示序列变为是砸3,0,1,2.该序列应该持久存储在数据库中.

我想知道如何设计数据库表来使其持久和可扩展.我的第一个想法是每行都有一个" 序列 "字段,表示显示顺序.默认情况下,该值应与id相同.从数据库中选择要显示的数据时,行按顺序而不是id按升序排序.

如果更改了序列,则会将其更新为新值.结果是它可能涉及其他行的很多变化.以上为例,最初表格如下:

|id   | sequence |
|0    | 0        |
|1    | 1        |
|2    | 2        |
|3    | 3        |
Run Code Online (Sandbox Code Playgroud)

现在,在将id为3的拖动行放到第一个之后.其序列更新为0.同时,还应更新ID为0,1,2的行.

|id   | sequence |
|0    | 1        |
|1    | 2        |
|2    | 3        |
|3    | 0        |
Run Code Online (Sandbox Code Playgroud)

我担心这种方法会使重新序列成本耗费大量资源而且不具备可扩展性.所以,我想可以通过将id乘以K(比如10)来对序列进行假设.这留下了用于插入的序列值之间的间隙.但是,如果将K + 1行移动到此间隙,则间隙仍然会消耗.

|id   | sequence |
|0    | 0        |
|1    | 10       |
|2    | 20       |
|3    | 30       |
Run Code Online (Sandbox Code Playgroud)

这似乎是数据库设计的常见问题.任何人都有更好的想法来实现这个目标吗?

Dis*_*oat 10

对我来说显而易见的答案是使用你提到的最后一个解决方案,但是使用小数(浮点数).

所以你先说,然后说:{0.1, 0.2, 0.3, 0.4, 0.5}.如果您将最后一项移到中间0.2,0.3它就变成了0.25.如果你把它移到顶部就变成了0.05.每次你只需要两侧的两个数字的中点.换句话说,前一个/下一个项目的平均值.

另一个类似的解决方案是使用字符,然后按字母顺序按字符串排序.从开始{1, 2, 3, 4, 5},如果您将2移动到2和3之间,则使用25.如果您对列表进行字符串排序,则保持正确的顺序:{1, 2, 25, 3, 4}.

我能用这些方法想到的唯一问题是,最终,你将达到浮点精度的极限,即试图在0.0078125和之间找到一个数字0.0078124.解决这个问题的几种方法:

  • 每隔一段时间运行一个脚本,遍历每个项目并重新排序{0.1, 0.2, 0.3, ...}.
  • 当你可以使用一个小数位时,不要使用两个小数位.之间0.20.25你可以使用0.23而不是计算0.225.
  • 在本地重新排序,而不是全局排序.如果您有{0.2, 0.3, 0.6}并且想要在之后插入0.2,则可以将第二个设置为0.4并插入新项目0.3.