Você pode manter as ordens como literais e usar a classificação léxica:
1. A
2. Z
Adicione uma tarefa:
1. A
3. L
2. Z
Adicione mais:
1. A
4. B
3. L
2. Z
Mova 2 entre 1 e 4:
1. A
2. AL
4. B
3. L
etc.
Você atualiza apenas um registro por vez:basta pegar uma letra média entre as primeiras que diferem:se você colocar entre
A
e C
, você pega B
, se você colocar entre ALGJ
e ALILFG
, você pega ALH
. Letra ao lado de existente conta como existente concatenada com a ao lado de
Z
. I. e. se você precisar colocar entre ABHDFG
e ACSD
F, você conta como entre ABH
e AB(Z+)
, e escreva AB(letter 35/2)
, que é ABP
. Se o comprimento da string acabar, você sempre poderá realizar uma reordenação completa.
Atualização:
Você também pode manter seus dados como uma lista vinculada.
Veja o artigo no meu blog sobre como fazer isso em
MySQL
:Em poucas palavras:
/* This just returns all records in no particular order */
SELECT *
FROM t_list
id parent
------- --------
1 0
2 3
3 4
4 1
/* This returns all records in intended order */
SELECT @r AS _current,
@r := (
SELECT id
FROM t_list
WHERE parent = _current
)
FROM (
SELECT @r := 0
) vars,
t_list
_current id
------- --------
0 1
1 4
4 3
3 2
Ao mover os itens, você precisará atualizar no máximo
4
linhas. Essa parece ser a maneira mais eficiente de manter uma lista ordenada e atualizada com frequência.