我在数据库中有一组对象。照片库中的图像、目录中的产品、书中的章节等。每个对象都表示为一行。我希望能够任意排序这些图像,将该排序存储在数据库中,这样当我显示对象时,它们就会以正确的顺序排列。
例如,假设我正在写一本书,每一章都是一个对象。我写我的书,并按以下顺序排列章节:
简介、可访问性、形式与功能、错误、一致性、结论、索引
它转到编辑器,并返回以下建议的顺序:
介绍、形式、功能、可访问性、一致性、错误、结论、索引
如何以稳健、有效的方式将此排序存储在数据库中?
我有以下想法,但我对其中任何一个都不感到兴奋:
大批。每行都有一个排序 ID,当更改顺序时(通过删除后插入),订单 ID 会更新。这使得检索变得容易,因为它只是
ORDER BY
,但似乎很容易破解。// REMOVAL
UPDATE ... SET orderingID=NULL WHERE orderingID=removedID
UPDATE ... SET orderingID=orderingID-1 WHERE orderingID > removedID
// INSERTION
UPDATE ... SET orderingID=orderingID+1 WHERE orderingID > insertionID
UPDATE ... SET orderID=insertionID WHERE ID=addedID
链表。每行都有一列用于排序中下一行的 id。遍历在这里似乎很昂贵,尽管可能通过某种方式使用
ORDER BY
我没有想到的。间隔数组。将 orderingID(如 #1 中使用的)设置为大,所以第一个对象是 100,第二个是 200,依此类推。然后当插入发生时,您只需将其放在
(objectBefore + objectAfter)/2
. 当然,这需要偶尔重新平衡,所以你不会让事物靠得太近(即使使用浮点数,你最终也会遇到舍入错误)。
这些对我来说都不是特别优雅。有没有人有更好的方法来做到这一点?