我在数据库表中有一堆消息。 我想按优先级发送这些消息,所以我将“优先级”列添加到“消息”表中。
但如果我想在两条消息之间插入“cram”消息并将此消息的先前优先级给予该怎么办?
我应该在此消息下更新所有消息的优先级。
所以请为我的数据库表提供完美的设计,以支持优先级更新。
答案 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),你会:
我认为这应该是相当低的维护,无论你多少次补习,它都能保证工作。 @richardtallent的浮点数概念也应该有效,但正如他所提到的,你可能遇到限制。
修改强>
我刚刚注意到@richardtallent答案末尾的段落提到了同样的想法,但是由于我输入了这个,我想我会保留它,因为它提供了一些额外的细节。