开发者社区> 问答> 正文

表示关系数据库中的顺序

我在数据库中有一组对象。图片库中的图像,目录中的产品,书中的章节等。每个对象都表示为一行。我希望能够对这些图像进行任意排序,并将该排序存储在数据库中,这样当我显示对象时,它们将以正确的顺序排列。

例如,假设我正在写一本书,而每一章都是一个对象。我写书,并按以下顺序排列各章:

简介,可访问性,形式与功能,错误,一致性,结论,索引

它进入编辑器,并按照以下建议顺序返回:

简介,形式,功能,可访问性,一致性,错误,结论,索引

如何以健壮,有效的方式将这种排序存储在数据库中?

我有以下想法,但我对其中任何一个都不感到兴奋:

数组。每行都有一个订购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。当然,这有时需要重新平衡,因此您之间的关系不会太紧密(即使使用浮点数,您最终也会遇到舍入错误)。

这些对我来说似乎都不是那么优雅。有人有更好的方法吗?

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-15 17:42:50 610 0
1 条回答
写回答
取消 提交回答
  • Rails中的acts_as_list mixin基本上按照您在#1中概述的方式处理此问题。它会查找一个名为position的INTEGER列(您可以将其当然覆盖为名称),然后使用该列执行ORDER BY。当您想重新排序商品时,您可以更新职位。每次使用它,对我来说都很好。

    附带说明一下,您可以通过使用稀疏编号来消除始终在插入/删除中重新定位的需要-有点像今天的基础...您可以为位置10、20、30等编号。如果需要在10到20之间插入内容,则只需将其插入位置15。您只需要在实际更改顺序或尝试插入时没有重新编号的情况下重新编号。

    当然,根据您的特定情况(例如,是否已将其他行加载到内存中),使用间隙方法可能有意义,也可能没有意义。

    2019-11-15 17:43:07
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RowKey与索引设计:技巧与案例分析 立即下载
事务、全局索引、透明分布式 立即下载
低代码开发师(初级)实战教程 立即下载