我在数据库中有一组对象.照片库中的图像,目录中的产品,书中的章节等.每个对象都表示为一行.我希望能够任意地对这些图像进行排序,将这种排序存储在数据库中,这样当我显示对象时,它们的顺序就会正确.
例如,假设我正在写一本书,每一章都是一个对象.我写了我的书,并按以下顺序列出章节:
简介,可访问性,表单与功能,错误,一致性,结论,索引
它转到编辑器,并返回以下建议的顺序:
简介,表格,功能,可访问性,一致性,错误,结论,索引
如何以强大,高效的方式将此排序存储在数据库中?
我有以下想法,但我对其中任何一个都不感兴趣:
阵列.每行都有一个订单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
.当然,这需要偶尔重新平衡,所以你没有太紧密的东西(即使有花车,你最终会遇到舍入误差).
这些对我来说都不是特别优雅.有没有人有更好的方法呢?
另一种替代方法是(如果您的RDBMS支持它)使用类型为array的列.虽然这打破了规范化规则,但在这种情况下它可能很有用.我知道有一个数组的数据库是PostgreSQL.