如何在两行之间插入行并在数据库中赋予它优先级?

时间:2009-08-30 15:07:07

标签: sql-server database-design

我在数据库表中有一堆消息。 我想按优先级发送这些消息,所以我将“优先级”列添加到“消息”表中。

但如果我想在两条消息之间插入“cram”消息并将此消息的先前优先级给予该怎么办?

我应该在此消息下更新所有消息的优先级。

所以请为我的数据库表提供完美的设计,以支持优先级更新。

5 个答案:

答案 0 :(得分:5)

对优先级使用 float 列而不是 int

然后,要在另外两个消息之间插入消息,请将两个消息的优先级值的平均值指定为新消息的优先级。 (例如,在具有优先级2和3的消息之间插入补充消息,为其分配优先级2.5)。

通过这样做,您不必更新任何其他消息的优先级,并且您可以继续在这些消息之间进行平均/插入等,直到您碰到浮点数的十进制精度限制(这需要一段时间) ,特别是如果原始优先级值往往很小)。

或者,在ORDER BY中的Priority之后添加另一列。在最简单的情况下,使用名为“ShowAfter”的位列,默认值为0.当您插入填充消息时,请为其提供与之后要查看的消息相同的优先级,但[ShowAfter]值为1。

答案 1 :(得分:2)

只是狂野的想法,没有为性能测试这个,但链接列表类型的结构应该在这里你想要你想要的。最多只需要更改3条记录

找出您要将新记录放在哪里, 请注意它前面有什么记录以及之后有什么记录。 新记录,建立以前的记录和下一个记录。 根据新记录重新链接上一个和下一个记录。

您可以通过在架构中添加2个字段(下一个和上一个)来完成此操作。

答案 2 :(得分:1)

只需包含一个带有默认getdate()值的时间戳列。这样,在发送消息时order by priority asc, createtime desc

如果您不总是想要进行后进先出(LIFO),则可以执行order by priority, senddate,然后将senddate设置为1/1/1900,以获得您想推送的任何内容先出。

如果你想通过某种方法对它们进行排名,你必须更新低于给定优先级的每一行,如果你想要“填充”一条消息。使用getdate()默认列,你不必担心这一点。

答案 3 :(得分:0)

有趣的是,也许您可​​以使用标识列作为主键但使用跳过一些值的增量?

这样,如果需要在现有边界之间插入/更新消息优先级,则可以保留空间。

有意义吗?

答案 4 :(得分:0)

与@Jimmy Chandra的想法类似,但使用单个链接列。

所以,你可能会有这些专栏:

ID | SortAfterID | OtherColumn1 | OtherColumn2

现在,假设您有五个ID为1到5的记录,并且您希望记录5在2到3之间排序。您的表格看起来像这样:

ID | SortAfterID | OtherColumn1 | OtherColumn2
1  | NULL        | ...          | ...
2  | 1           | ...          | ...
3  | 5           | ...          | ...
4  | 3           | ...          | ...
5  | 2           | ...          | ...

我会设置一个约束,以便SortAfterID引用ID。

如果你现在想要插入1到2之间的新记录(ID = 6),你会:

  1. 插入ID = 6且SortAfterID = 1的新记录。
  2. 更新记录,ID = 2,以便SortAfterID = 6。
  3. 我认为这应该是相当低的维护,无论你多少次补习,它都能保证工作。 @richardtallent的浮点数概念也应该有效,但正如他所提到的,你可能遇到限制。

    修改

    我刚刚注意到@richardtallent答案末尾的段落提到了同样的想法,但是由于我输入了这个,我想我会保留它,因为它提供了一些额外的细节。