我有兄弟数据,用户需要定义“官方”订单,而不是按某个名称按字母顺序排列,按创建/发布日期,按值(例如工资,销售额或排名)。
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 NextRecordId
(ASC
或DESC
)将无效。对于ORDER BY ASC
,它将首先选择NextRecordId最小的记录。那不是我们想要的订单。
似乎我们必须迭代(在存储过程中),每次迭代都需要SELECT WHERE Id=@CurrentNextRecordId
,然后将每个结果放在一个新表中。
您如何跟踪哪个记录是第一个 - 有一个IsFirst
列,或者父表中有FirstChildRecordId
?我们可以说NextRecordId = 0
的记录是最后一个。看起来在数据库中创建列来实现数据结构并不是一个好主意,不是吗?
所以,我坚持这个,我已经通过这个论坛和网上搜索 - 找不到一个好的解决方案。所有这些似乎都需要某种类型的后期维护(重新种植,但你如何确定何时)或可能需要进行昂贵的计算(更新插入索引后所有记录的排序顺序),每次“移动”。
对此有任何新的见解或伎俩?
答案 0 :(得分:1)
具有灵活排序顺序的一种方法是使用字符串而不是数字。
最初将零填充数字指定为排序顺序:'001'
,'002'
。 。
然后,当您想在两个值之间添加内容时,只需在值中添加5
即可。字符串的排序会按照您想要的顺序放置'001'
,'0015'
和'002'
。
当然,您可以通过测试最后一位数来提高效率。如果它是'5'
,你想要更大的东西,请输入7或8.您还可以通过将字符集扩展为包含字母和数字来提高效率。