我在数据库中有一组对象。图片库中的图像,目录中的产品,书中的章节等。每个对象都表示为一行。我希望能够对这些图像进行任意排序,并将该排序存储在数据库中,这样当我显示对象时,它们将以正确的顺序排列。
例如,假设我正在写一本书,而每一章都是一个对象。我写书,并按以下顺序排列各章:
简介,可访问性,形式与功能,错误,一致性,结论,索引
它进入编辑器,并按照以下建议顺序返回:
简介,形式,功能,可访问性,一致性,错误,结论,索引
如何以健壮,有效的方式将这种排序存储在数据库中?
我有以下想法,但我对其中任何一个都不感到兴奋:
数组。每行都有一个订购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
Rails中的acts_as_list mixin基本上按照您在#1中概述的方式处理此问题。它会查找一个名为position的INTEGER列(您可以将其当然覆盖为名称),然后使用该列执行ORDER BY。当您想重新排序商品时,您可以更新职位。每次使用它,对我来说都很好。
附带说明一下,您可以通过使用稀疏编号来消除始终在插入/删除中重新定位的需要-有点像今天的基础...您可以为位置10、20、30等编号。如果需要在10到20之间插入内容,则只需将其插入位置15。您只需要在实际更改顺序或尝试插入时没有重新编号的情况下重新编号。
当然,根据您的特定情况(例如,是否已将其他行加载到内存中),使用间隙方法可能有意义,也可能没有意义。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。