排序订单管理 - 不满意SortOrder * 10 ^ n或链接列表实现

时间:2013-12-14 21:57:25

标签: sql sorting maintenance

我有兄弟数据,用户需要定义“官方”订单,而不是按某个名称按字母顺序排列,按创建/发布日期,按值(例如工资,销售额或排名)。

SortOrder * 1 ^ n

我认为这样的可排序对象需要一个整数SortOrder列,其中较小的值意味着更靠近第一个项目(SortOrder = 1表示第一个项目。)

许多人建议在插入新记录时自动指定SortOrder = newId * 1000(n = 3)。在后面的行中,我们将在两个记录之间插入一条记录,插入记录的排序顺序将设置为

inserted.SortOrder = (previous.SortOrder + next.SortOrder) / 2

是的,但这样做的时间足够多,你会用完“精确度” - 当previous.SortOrder = 3000和next.SortOrder = 3001时,你会为插入的记录分配什么样的顺序?

增加n值,你只会延迟问题。


链接列表实施

有人建议有NextRecordId。这样,我们就有了一条记录的“踪迹”。在两个之间插入记录只需要两次更新 -

previous.NextRecordId = inserted.Id
inserted.NextRecordId = next.Id

next后面的项目不会受到影响。

这似乎是一个好建议,但也有问题。

如何拉动数据以正确的顺序显示? ORDER BY NextRecordIdASCDESC)将无效。对于ORDER BY ASC,它将首先选择NextRecordId最小的记录。那不是我们想要的订单。

似乎我们必须迭代(在存储过程中),每次迭代都需要SELECT WHERE Id=@CurrentNextRecordId,然后将每个结果放在一个新表中。

您如何跟踪哪个记录是第一个 - 有一个IsFirst列,或者父表中有FirstChildRecordId?我们可以说NextRecordId = 0的记录是最后一个。看起来在数据库中创建列来实现数据结构并不是一个好主意,不是吗?


所以,我坚持这个,我已经通过这个论坛和网上搜索 - 找不到一个好的解决方案。所有这些似乎都需要某种类型的后期维护(重新种植,但你如何确定何时)或可能需要进行昂贵的计算(更新插入索引后所有记录的排序顺序),每次“移动”。

对此有任何新的见解或伎俩?

1 个答案:

答案 0 :(得分:1)

具有灵活排序顺序的一种方法是使用字符串而不是数字。

最初将零填充数字指定为排序顺序:'001''002'。 。

然后,当您想在两个值之间添加内容时,只需在值中添加5即可。字符串的排序会按照您想要的顺序放置'001''0015''002'

当然,您可以通过测试最后一位数来提高效率。如果它是'5',你想要更大的东西,请输入7或8.您还可以通过将字符集扩展为包含字母和数字来提高效率。