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

Sql server 如何在两行之间插入行并在数据库中赋予它优先级?,sql-server,database-design,Sql Server,Database Design,我在数据库表中有一堆消息。 我想按优先级发送这些消息,所以我在“消息”表中添加了“优先级”列 但是,如果我想在两条消息之间插入“cram”消息,并将先前的优先级赋予此新消息,该怎么办 我是否应该更新此邮件下的所有邮件优先级 因此,请为我的数据库表提供完美的设计,以支持优先级更新。只需包含一个带有默认getdate()值的时间戳列。这样,在发送消息时,按优先级排序asc,createtime desc 如果您不总是希望执行后进先出(LIFO),您可以按优先级执行顺序,发送日期,然后将发送日期设置为

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

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

我是否应该更新此邮件下的所有邮件优先级


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

只需包含一个带有默认
getdate()
值的时间戳列。这样,在发送消息时,
按优先级排序asc,createtime desc

如果您不总是希望执行后进先出(LIFO),您可以按优先级执行
顺序,发送日期
,然后将
发送日期
设置为
1/1/1900
,以便首先推出任何内容


如果您想通过某种方法对它们进行排序,那么如果您想“填充”消息,就必须更新给定优先级以下的每一行。对于
getdate()
默认列,您不必担心这一点。

使用float列作为优先级,而不是int

然后,要在其他两条消息之间插入一条消息,请将这两条消息的平均优先级值指定为新消息的优先级。(例如,要在优先级为2和3的消息之间插入cram消息,请为其指定优先级为2.5)

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


或者,在“排序依据”中的“优先级”后面添加另一列。在最简单的情况下,使用名为“ShowAfter”的位列,默认值为0。插入cram消息时,将其优先级设置为与要查看的消息相同的优先级,但[ShowAfter]值为1。

有趣的是,您可以使用标识列作为主键,但使用跳过几个值的增量

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


有道理吗

只是一个疯狂的想法,还没有测试它的性能,但是链接列表的结构应该是你想要的。最多只需更改3条记录

找出你想把新唱片放在哪里, 注意什么记录在它前面,什么记录在它后面。 新记录,建立上一个记录和下一个记录。 根据新记录重新链接上一条记录和下一条记录


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

类似于@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),您可以:

  • 插入ID为6且SortAfterID为1的新记录
  • 更新ID为2的记录,以便SortAfterID为6
  • 我认为这应该是相当低的维护,而且无论你死记硬背多少次,它都能保证工作。@richardtallent的浮点数思想也应该起作用,但正如他所提到的,您可能会遇到限制

    编辑


    我刚刚注意到@richardtallent answer结尾的一段提到了同样的想法,但由于我把这些都打出来了,我想我会把它保留在这里,因为它提供了一些额外的细节。

    对不起,埃里克,不知怎的,我编辑了你的答案而不是我自己的答案,删除了编辑。。。这个答案也很好,可能比我的答案慢一点,并且要求业务逻辑依赖于插入日期来确定二阶排序。但是OTOH,他可能已经有了一个带有插入日期/时间的字段,这意味着除了SELECT查询之外,不需要做任何更改,而我的两个答案都需要对表设计做一些小的更改。这是个好主意,但是SQL中的排序并不像它所说的那样简单。但这是可以做到的:–Mathias Fritsch 0秒前非常感谢。就是这样。我的最后一段并没有建议使用链表,它只是对按列的二阶顺序进行了修改,这样具有相同优先级的行(原始行和新的cram消息)将以所需的顺序出现。对于每个“正常”行,它最多只能处理一条cram消息。