8797 sujets

Développement web côté serveur, CMS

Bonjour à tous
J'ai une table avec un identifiant (un numéro qui s'auto-incrémente) comme clef primaire que j'utilise pour trier puis afficher mon contenu.
Je voudrais pouvoir modifier l'ordre d'affichage de mon contenu, mais pour se faire je dois par exemple inverser les clefs primaires de mes éléments... Je voudrais savoir si c'est une manipulation correct ou à proscrire, s'il n'existe pas une technique approprié au trie (il est peut-être préférable par exemple de créer un champ spécifique pour l'ordre qui permet de ne jamais modifier la clef primaire).
Merci à tous.
cucureuil a écrit :
(il est peut-être préférable par exemple de créer un champ spécifique pour l'ordre qui permet de ne jamais modifier la clef primaire).
Exactement Smiley cligne !
Bonjour,

ton problème n'est pas très bien exposé... qu'appelles tu "inverser les clefs primaires". Une clef est liée à un enregistrement, elle est unique, c'est une grave erreur de conception si tu a à modifier la clé liée à une donnée.

Je vais peut-etre faire une remarque bête mais connais-tu l'instruction SQL "ORDER BY" car c'est certainement ce dont tu as besoin. Je t'invite à faire une recherche sur ton moteur préféré en précisant le nom de ton SGBD (Mysql, Postgres, ...)

Edit : Je viens de comprendre que ton soucis ne situe peut-être pas au niveau du "ORDER BY", dans ce cas en effet il faut créer un champ spécifique relatif à l'ordre
Modifié par skywalk3r (29 May 2008 - 15:17)
a écrit :
c'est une grave erreur de conception si tu a à modifier la clé liée à une donnée

C'est justement ce que je pensais et la raison de mon post Smiley cligne
Je fais bien entendu un order by (sur la clef primaire) pour trier.

Bon on est bien d'accord qu'il est propre de créer un champ attitré à l'ordre des éléments pour le trie et l'affichage. Impec.
Merci.
En effet, c'est la méthode de conception préconisée dans des cas où les enregistrements vont être demandés dans un ordre qui n'est un ordre de tri d'aucun autre champ.

J'ajouterai qu'au lieu d'ordonner avec un suite d'unités (1, 2, 3, 4, ...) il est préférable de laisser un espace entre l'ordre de chaque élément, genre (10, 20, 30, 40, ...) ce qui te permettra d'intercaler des enregistrements entre deux autres sans avoir à déplacer tous les autres, tu vas y gagner questions performances. Tu peux même aller de 100 en 100 ou de 1000 en 1000, c'est à toi de voir à quels fréquences cela risque de t'arriver. Dans tous les cas prendre un espace de 10 ne va sensiblement pas faire grossir ta base de données et accorde un minimum de liberté avant d'avoir à resynchroniser l'ordre de tes enregs...
Modifié par skywalk3r (29 May 2008 - 16:56)
Une des raisons de ne pas modifier la clés primaire est la suivante: imagine que tu as une autre table , par exemple "documents" qui contient un champ id_page qui fait référence à ta table, si tu modifie la clés primaire tu perds la référence. C'est un exemple parmi d'autre.

Personnellement j'utilise un champ "order" avec un formulaire "edit order" qui affiche tous les tables avec le titre et a coté un input avec le numéro de "order" : il suffit de renseigner les numéros dans l'ordre que l'on souhaite et le tour est joué. Ainsi il n'y a pas besoin d'éditer toute les pages pour changer l'ordre. C'est super efficace et facile à comprendre pour un utilisateur.
Modifié par matmat (29 May 2008 - 18:48)
a écrit :
il est préférable de laisser un espace entre l'ordre de chaque élément

Ok c'est ce que j'allais demander, ça me trottait dans la tête.
Mais j'hésitais entre utiliser des "écart" comme ce que tu proposes ou bien tout décaler en php lors d'un changement...

ça dépend du nombre d'éléments et de la fréquence de modif je suppose...