71 votes

Meilleure façon de sauvegarder une liste commandée dans la base de données tout en conservant l'ordre

Je me demandais si quelqu'un a une bonne solution à un problème que j'ai rencontré à de nombreuses reprises au cours des dernières années.

J'ai un panier et mon client demande explicitement que l'ordre est important. J'ai donc besoin de conserver l'ordre de la DB.

Le moyen le plus évident serait de tout simplement insérer un OrderField où je assigner le numéro de 0 à N et de tri de cette façon.

Mais cela rendrait la réorganisation des plus difficile et j'ai un peu l'impression que cette solution est un peu fragile et que vous reviendrez à moi un jour.

(J'utilise C# 3,5 avec NHibernate et SQL Server 2005)

Merci

49voto

Kickaha Points 559

Ok, voici ma solution pour rendre la programmation plus facile pour quelqu'un qui se passe le long de ce fil. le truc, c'est d'être en mesure de mettre à jour tous les index ci-dessus ou en dessous d'une insertion / délétion dans une mise à jour.

À l'aide d'un numérique (entier) de la colonne de votre tableau, pris en charge par les requêtes SQL

CREATE TABLE myitems (Myitem TEXT, id INTEGER PRIMARY KEY, orderindex NUMERIC);

Pour supprimer l'élément à orderindex 6:

DELETE FROM myitems WHERE orderindex=6;    
UPDATE myitems SET orderindex = (orderindex - 1) WHERE orderindex > 6;

Pour échanger deux éléments (4 et 7):

UPDATE myitems SET orderindex = 0 WHERE orderindex = 4;
UPDATE myitems SET orderindex = 4 WHERE orderindex = 7;
UPDATE myitems SET orderindex = 7 WHERE orderindex = 0;

c'est à dire 0 n'est pas utilisé, il faut donc utiliser un il comme un mannequin pour éviter d'avoir l'ambiguïté d'un élément.

Pour insérer à 3:

 UPDATE myitems SET orderindex = (orderindex + 1) WHERE orderindex > 2;
 INSERT INTO myitems (Myitem,orderindex) values ("MytxtitemHere",3)

31voto

sean wagner Points 154

La meilleure solution est une liste Doublement chaînée. O(1) pour toutes les opérations, à l'exception de l'indexation. Rien ne peut l'indice de SQL rapidement sauf si une clause where sur l'élément que vous voulez.

0,10,20 types d'échouer. Colonne de séquence ceux échouer. Flotteur colonne de séquence échoue au groupe se déplace.

Liste doublement chaînée est les mêmes opérations pour l'ajout, la suppression, groupe suppression de, groupe outre, le groupe de bouger. Liée unique liste fonctionne bien aussi. Doublement chaînée est mieux avec SQL à mon avis cependant. Simple liste chaînée vous oblige à avoir la totalité de la liste.

25voto

Galwegian Points 29966

FWIW, je pense que la façon dont vous suggérez (c’est-à-dire que vous enregistrez la commande dans la base de données) n’est pas une mauvaise solution à votre problème. Je pense aussi que c'est probablement le moyen le plus sûr et le plus fiable.

10voto

Js. Points 61

Pourquoi ne pas utiliser une implémentation de liste chaînée? Avoir une colonne le tiendra la valeur (numéro de commande) du prochain article. Je pense que c'est de loin le plus facile à utiliser pour l'insertion de commandes entre les deux. Pas besoin de renuméroter.

5voto

Binary Worrier Points 27424

Malheureusement, il n'existe pas de formule magique pour cela. Vous ne pouvez pas garantir l'ordre de tout SELECT déclaration SANS une clause order by. Vous avez besoin d'ajouter la colonne et le programme autour d'elle.

Je ne sais pas qui je vous recommande l'ajout de lacunes dans l'ordre de la séquence, en fonction de la taille de vos listes et les visites sur le site, vous pouvez gagner très peu pour le dessus de la tête de la manipulation de la logique (que vous ayez encore besoin de répondre pour l'occasion où tous les espaces ont été utilisés). J'avais regarder de plus près pour voir ce que les avantages pour vous dans votre situation.

Désolé je ne peux pas proposer quelque chose de mieux, j'Espère que ça a aidé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X