排序顺序管理 - 不满意 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 NextRecordId
(ASC
或 DESC
)不起作用。对于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 或链表实现的主要内容,如果未能解决你的问题,请参考以下文章