我有一个包含任务的表,我想根据任务的优先级给这些任务一个明确的顺序。我能想到的唯一方法是通过一个唯一的int 列来索引任务在优先级方面的位置(即 1 是前 1000 是低的)。
问题是说我想更新任务并将其优先级设置为较低的值,我将不得不更新其当前值和新值之间的所有其他行。
任何人都可以提出更好的实施方式吗?
我有一个包含任务的表,我想根据任务的优先级给这些任务一个明确的顺序。我能想到的唯一方法是通过一个唯一的int 列来索引任务在优先级方面的位置(即 1 是前 1000 是低的)。
问题是说我想更新任务并将其优先级设置为较低的值,我将不得不更新其当前值和新值之间的所有其他行。
任何人都可以提出更好的实施方式吗?
使用实数值作为优先级。您始终可以在两个现有值之间滑动一个值,例如newPri = task1Pri + (task2Pri - task1Pri)/2
Task1 具有较低优先级的数值(这可能是较高的优先级)。
Corin 指出,对于插入到优先级列表顶部或底部的任务,必须计算最小和最大优先级。
joelhardi 提醒我们,重新排序过程是不时清理表格的好主意。
不要像你说的那样创建一个编号的列,而是创建一个名为 parent 的字段。每行包含其父项的 pk。当您想向下移动一个项目时,只需将其父 pk 更改为新项目以及在其父 pk 中引用它的项目。想想单链表。
我最喜欢凯文的回答,但如果你想要一个快速而简单的解决方案,只需按照你已经描述的方式进行操作,而不是增加 1,而是增加 10 或 100 ......如果你需要这样的话重新确定优先级,您在任务之间有一些回旋余地。
我将只分配少量值 (1..10),然后按优先级 DESC、DateCreated ASC 排序。如果您需要为每个任务设置不同的优先级,则需要像您说的那样更新 WHERE Priority > xxx。
如果没有两个任务可以具有相同的优先级,那么我认为这就是您必须做的。但是您可以有一个 priority 和一个 datemodified 列,如果您允许重复优先级,则只需根据优先级和上次更新对两者进行排序即可。