代码之家  ›  专栏  ›  技术社区  ›  Wahid Bitar

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

  •  3
  • Wahid Bitar  · 技术社区  · 17 年前

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

    所以,请给我一个完美的数据库表设计,以支持优先级更新。

    5 回复  |  直到 17 年前
        1
  •  5
  •   richardtallent    17 年前

    浮动 列,而不是 .

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

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

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

        2
  •  2
  •   Jimmy Chandra    17 年前

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

    找出你想把新唱片放在哪里, 新记录,建立上一个记录和下一个记录。 根据新记录重新链接上一条记录和下一条记录。

    您可以通过在模式中添加两个字段(下一个和上一个)来实现这一点。

        3
  •  1
  •   richardtallent    17 年前

    getdate() 价值这样,在发送消息时, order by priority asc, createtime desc

    如果你不总是想做后进先出(LIFO),你可以做 order by priority, senddate 然后设置 senddate 到 1/1/1900

    getdate()

        4
  •  0
  •   John Sansom    17 年前

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

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

    有道理?

        5
  •  0
  •   devuxer    17 年前

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

    因此,您可能有以下列:

    ID | SortAfterID | OtherColumn1 | OtherColumn2
    

    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。

    编辑

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