排序顺序管理 - 不满意 SortOrder * 10^n 或链表实现

Posted

技术标签:

【中文标题】排序顺序管理 - 不满意 SortOrder * 10^n 或链表实现【英文标题】:Sort Order Management - Not Satistfied with SortOrder * 10^n or Linked List Implementation 【发布时间】:2013-12-14 21:57:24 【问题描述】:

我有用户需要定义“官方”顺序的兄弟数据,而不是按某些名称、创建/发布日期、价值(例如薪水、销售额或排名)的字母顺序。

排序顺序 * 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】:

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

最初分配零填充数字作为排序顺序:'001''002'。 . .

然后,当您想在两个值之间添加一些内容时,只需在该值中添加一个5。字符串的排序会将'001''0015''002' 按您想要的顺序排列。

当然,您可以通过测试最后一位数字来提高效率。如果是'5',并且您想要更大的值,请输入 7 或 8。您还可以通过扩展字符集以包括字母和数字来提高效率。

【讨论】:

以上是关于排序顺序管理 - 不满意 SortOrder * 10^n 或链表实现的主要内容,如果未能解决你的问题,请参考以下文章

实体框架按排序顺序加载子集合

如何在jqGrid中将初始排序顺序设置为降序

Android房间复合主键,排序顺序

sql - 如何使用其他字段作为排序顺序进行排序?

Core Data 中的排序顺序具有多重关系

更新SQL适配器后保留Datagrid视图的排序顺序