11
votes

Comment conserver la commande d'enregistrements dans une table de base de données

Je crée une table de base de données qui va stocker des liens de menu qui seront finalement apparaître sur une page Web.

Mon problème est que je veux contrôler l'ordre des éléments de menu. Je pourrais avoir un champ appelé ordre mais chaque fois que je dispose d'un nouveau lien de menu, je devrais insérer la commande et modifier tous les enregistrements avec une commande supérieure à +1. P>

Par exemple, disons que je veux que je veux le Liens (dans cet ordre): P>

Name      Order  
Home      1  
About     2  
Products  3  
Shopping  4  


0 commentaires

5 Réponses :


6
votes

Sans commande par, vous ne pouvez pas garantir l'ordre des données - généralement, sans ordre de celui-ci sera basé sur une ordonnance d'insertion.

Malheureusement, il n'y a pas de convention qui fonctionne bien pour un ordre de tri personnalisable de l'utilisateur .
On pourrait s'en tirer avec des fonctions d'analyse / fenêtres / classement comme Row_Number, mais cela dépend de la prise en charge des données et de la base de données (MySQL ne prend pas en charge les fonctions analytiques, Oracle 9i + / PostgreSQL 8.4 + / SQL Server 2005+ DO). Mais les fonctions analytiques ne vous aident pas si vous souhaitez une entrée commençant par "B" pour apparaître avant "A" / etc.

Vos options sont d'utiliser deux instructions pour insérer un enregistrement unique: xxx

... ou supprimez les enregistrements existants et réinsérez la liste dans la nouvelle commande.


0 commentaires

9
votes

Je pense que cela est lié au problème général de l'utilisation d'un tableau VS une liste liée. Que diriez-vous de stocker une clé étrangère faisant référence à l'enregistrement suivant dans la même table? Ceci est la liste liée comme une approche.

Pour votre exemple, il n'y a pas trop d'onglets, une approche basée sur une matrice devrait donc fonctionner correctement. Mais pour une personne ayant des centaines d'enregistrements, il peut être utile d'utiliser une clé étrangère auto-référentielle. P>

ID Name       NExT  
 1 Home       5  
 2 About      3  
 3 Products   4 
 4 Shopping   NULL
 5 Contact us 2


8 commentaires

Le problème ici est qu'il ne résout pas le problème. faire un changement nécessite que vous mettriez à jour tous les enregistrements> cette ligne


Personne ne change ne vous oblige pas à mettre à jour toutes les lignes. Si vous ajoutez, contactez-nous après la maison, la table aimerait comme indiqué. Mise à jour de la réponse.


Mais vous mettez à jour la colonne suivante de chaque enregistrement. . Je ne comprends pas pourquoi vous dites que vous ne mettez pas à jour toutes les lignes


Non, je ne mettez pas à jour tous les enregistrements. Notez que seules les lignes avec ID 1 et 5 sont mises à jour dans l'exemple. Les lignes 2, environ, 3 , 3, produits, 4 et 4, shopping, null ne sont pas mis à jour dans l'exemple ci-dessus. Pensez en termes de liste liée et d'insert de tableau.


@leora fait ma mise à jour répondre à votre question? Y a-t-il des doutes que vous avez besoin de moi pour clarifier?


Ouais . . logique . . cherchait trop vite avant: 0


Comment pouvez-vous écrire une requête qui commande la table correctement? Il semble qu'il n'y ait pas un simple (un qui n'est pas récursif).


Oui, @rohitbanga, allez-y et essayez de trier ceci :)



4
votes

Vous devez considérer que lorsque vous utilisez une liste liée, alors lorsque vous souhaitez réorganiser l'un des éléments, vous devez également mettre à jour les autres enregistrements et que cela doit être effectué dans une transaction qui n'est pas rapide du tout. (Vous Besoin de transaction car toutes les mises à jour doivent être effectuées complètement ou aucune d'entre elles ne doivent être mises à jour)
Il y a une autre solution pour ce problème qui fonctionne sur petites listes .
Pour utiliser cette méthode, vous donnez à chacun de vos enregistrements un numéro. Par exemple: xxx

Les lignes avec un nombre plus petit sont au début de la liste et la ligne avec le plus grand nombre sera le dernier élément de votre liste. Maintenant ici, voici l'astuce, si vous vouliez réorganiser les produits produits et insérez-le entre la maison et sur tout ce que vous avez à faire est de Changez le champ de numéro de votre produit pour être égal au nombre entre home et à propos de Number
La maison numéro est 5 et le numéro à propos de est 10, donc le champ Numéro de produit sera (5 + 10) / 2 = 7,5 < / p> xxx

et maintenant, vous pouvez désormais trier la liste finale, en fonction du champ Numéro


0 commentaires

1
votes

Une meilleure solution consiste à créer une matrice de vos identifiants d'éléments dans l'ordre et à le tourner dans un tableau JSON et de le stocker en tant que fichier ou dans une table ou où vous le souhaitez. Vous pouvez ensuite extraire vos objets dans la base de données et mapper votre tableau dans une liste d'éléments. Vous continuez d'un côté dans la commande et, de l'autre, les données. Si vous supprimez un élément de la base de données, vous pouvez supprimer des éléments de votre mappage de votre réseau. Si vous ajoutez un nouvel élément à la base de données, vous devez les ajouter à votre tableau aussi, mais si vous ne le faites pas, rien n'est cassé.

longue histoire courte:

1. Enregistrez la commande sous la forme d'un tableau JSON d'IDS dans un fichier ou une table ou où vous voulez.

2. Enregistrez vos éléments dans votre base de données sans vous soucier de leur commande.

3.Quand vous avez besoin, récupérez votre éventail d'identifiants et cartez-les à leur élément respectif de la base de données.


0 commentaires

0
votes

Vous pouvez ajouter 2 colonnes (après, avant) Par exemple, contactez-nous est après la maison et avant, si vous souhaitez ajouter un nouveau lien entre nous contacter et chez vous, vous devez simplement modifier 3 enregistrements. Maisons avant la colonne ne change à (nouveau nom de lien), Ensuite, vous insérez un nouveau lien puis contactez-nous après des modifications de colonne (nouveau nom de lien). Désolé je ne suis pas bon en anglais.


0 commentaires