Un retard de réponse: peut-être vous pouvez stocker la clé de tri comme une chaîne de caractères. L'insertion d'un enregistrement entre deux lignes existantes peut être fait trivialement par l'ajout d'un caractère supplémentaire à une chaîne, par exemple, l'insertion de "AM" entre les lignes "A" et "B". Pas de réorganisation est nécessaire. Une idée similaire pourrait être accompli à l'aide d'un nombre à virgule flottante ou une simple peu arithmétique sur un entier de 4 octets: insérer une ligne avec une valeur de clé de tri qui est à mi-chemin entre les lignes adjacentes.
Cas pathologiques pourraient surgir si la chaîne est trop longue, le flotteur est trop petit, ou il n'y a plus de place dans l'int, mais ensuite, vous pouvez simplement renuméroter l'entité et de prendre un nouveau départ. Une analyse à travers et mise à jour de tous vos enregistrements sur une occasion rare est beaucoup mieux que défaillant chaque objet, chaque fois qu'un utilisateur se réorganise.
Considérons, par exemple, int32. À l'aide de la haute 3 octets comme la première commande vous donne près de 17 millions de lignes avec la possibilité d'insérer jusqu'à 256 lignes entre deux lignes. 2 octets permet l'insertion de 65000 lignes entre deux lignes avant de les analyser.
Voici le pseudo-code que j'ai en tête pour un 2 octets d'incrémentation et de 2 octets pour l'insertion:
AppendRow:item
item.sortKey = tail.sortKey + 0x10000
InsertRow:item betweenRow:a andNextRow:b
item.sortKey = a.sortKey + (b.sortKey - a.sortKey) >> 1
Normalement, vous serait d'appeler AppendRow résultant dans les lignes avec sortKeys de 0x10000, 0x20000, 0x30000, etc. Parfois, vous devez InsertRow, dire entre la première et la deuxième, résultant en une sortKey de 0x180000.