2009-01-24 95 views
4

我想弄清楚一种让用户对记录进行排序(等朋友列表)的方法。让用户对记录进行排序?

我想给用户,或者通过输入数字(之间)移动的记录(朋友)直行至列表的顶部或底部的机会。

开始我以为只是增加了一个名为SortOrder的(INT)列于表中所有用户的朋友,并根据其订购的记录应显示设置的号码。

但我想避免的是,等用户有400个朋友,如果他想设置好友号码400在列表中的位置1,那么我将不得不更新每一个记录与一个新的排序。

所有数据都存储在MS Sql数据库中。

我希望有人对此有一个神奇的解决方案?

回答

3

使用浮点数为排序列。

设置初始的项目,如0.0,1.0等等

移动到顶部,利用分钟-1.0。移动到底部,设置为最大值+1.0。在两个项目之间移动,设置为(上一个+下一个)/2.0

这与行号方法类似,但数字之间有更多“空间”。从理论上讲,当两个关联值增长到结束时,仍然需要重新编号。我不知道这种情况在实际中会多快发生,但我预计这种情况很少发生,因此可以在任何维护任务中完成。


[编辑] FWIW,这个问题又回到了我几次,所以here's a way that does roughly the same, but with strings

0

这听起来像你正在寻找一个链表的类型结构,其中每个记录将按顺序保存下一个记录的ID。

+0

听起来像是正确的解决方案,除了将其存储在关系数据库中并基于链表结构对结果进行排序将非常困难且耗时。 – Karl 2009-01-30 23:05:41

0

我不知道魔法,但是对于移动到顶部或底部,您可以将SortOrder设置为最小/最大(SortOrder)+/- 1。谁说顶部必须是1或0?

+0

这真的只处理移动到顶部或底部,而不是在中间某处。尽管如此,我还是没有找到你,因为它对于那些有限的情况很有帮助,特别是当你的初始SortOrder键处于允许范围的中间时(例如对于有符号的32位int,说2^30)。 – paxdiablo 2009-01-24 11:58:42

0

下面是我该怎么做:使用SortOrder列。据推测,会有一个初始的默认排序顺序,按字母排序,因此每个人都会根据其字母顺序被赋予SortOrder值。

然后,当用户将某人移到顶端时,您可以将SortOrder设置为最大值+1。如果他们将某人移到底部,那么它将是min -1。如果他们把某人移到中间的某个地方,那么你会想要计算他们正在移动的中间的哪一半。如果它是上半部分,那么碰到他们之上的每个人的SortOrder。如果它是下半部分,那么减少下面每个人的SortOrder。

不知道有这样做的更快捷的方式...

+0

最糟糕的情况是将某人从最后一个朋友转移到第二个最好的朋友,那么您必须更改N-1个记录。如果您希望最小化行更改,那么有更好的方法。尽管如此,我还没有找到你,因为它有用。 – paxdiablo 2009-01-24 11:56:36

+0

在你的场景中,为什么不把最好的朋友的SortOrder加1,然后将你想要移动的朋友的SortOrder(最后的朋友)设置为最好的朋友的SortOrder-1? – 2009-01-25 01:05:17

1

我无法想象他们会做这往往足以成为一个真正的问题,但是,如果你担心,使用的伎俩我们从过去的几天开始使用BASIC代码。

回来时,基本有行号,我们只需把它们编号为10,20,30等,因此,如果我们需要插入10和20之间的一个,我们就称它为15.或者,如果20应已经到了10之前,我们将其重新编号为5.

对于32位整数列,您可以拥有200,000个间隔为100的朋友,绰绰有余以移动事物,特别是如果您聪明的话。

您可能需要偶尔运行扫描作业重新编号朋友100,200,等(不大不小的磁盘碎片整理程序,为您的社交网络)。不要试图通过查看朋友号码来检测这一点,使用另一个字段,当用户重新安排他们的朋友并在进行碎片整理时将其清除时将其设置为true。这将会更有效率。

0

你可以把它看作朋友组。

最初,每个人都在组0中,并且顺序是按名称或其他。(a)
- 如果用户随后将朋友(a)的“群组”增加到1,则他们移动到顶部
-如果用户然后将朋友(b)的“群组”增加到1,则(a)和(b)出现在顶部
- 然后,如果用户增加了“本集团”的朋友(b)再次,然后(b)出现第1和第(一)第二

只是thougt ...

相关问题