Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment laisser un utilisateur s'insérer n'importe où dans une liste ?

La méthode la plus simple du point de vue du code consiste à utiliser un style de liste liée, où vous avez un identifiant d'élément suivant, plutôt qu'une valeur de commande. Ceci est moins utile dans les petites listes, mais lorsque vous commencez à augmenter la taille de la liste, cela rend les mises à jour/déplacements/suppressions beaucoup plus propres et empêche de mettre à jour éventuellement des milliers de tuples pour faire 1 changement de commande.

++ Je n'ai pas d'exemple de code exact sous la main, mais vous feriez un appel pour toutes les listes d'un utilisateur

SELECT Posts.id, Posts.next, Posts.content, User.firstPost FROM db.posts AS Posts 
JOIN db.user as User ON Posts.ownerid = User.id 
WHERE User.id='123' AND Posts.active = 1;

Cela obtiendrait tous les messages d'un seul utilisateur, puis vous auriez un champ contenant l'identifiant du message suivant. Pour commencer, vous auriez besoin d'une clé pour identifier le premier message (stockez l'identifiant du premier message dans les informations de l'utilisateur). Après avoir extrait le premier message, vous saisissez sa valeur "suivante" et l'utilisez pour identifier le message suivant.

Cela semble un peu fou pour une courte liste, mais pensez à un utilisateur avec 1000 messages. S'ils ont besoin d'ajouter 1 poste en 2ème position. Dans un système de commande numérique traditionnel, vous auriez maintenant besoin de mettre à jour 999 autres lignes avec une mise à jour +1. Avec cette solution, si vous avez besoin d'insérer un message en deuxième position, vous interrogez simplement le premier message pour obtenir sa valeur suivante. Une fois que vous l'avez, vous le modifiez pour qu'il soit la valeur du nouveau deuxième message et définissez la valeur suivante du deuxième message comme étant celle détenue à l'origine par le premier.

[1st Post] --Next---> [2nd Post] --Next---> [3rd Post]

Après insertion :

[1st Post] -.                          .--> [2nd Post] --Next---> [3rd Post]
            `--Next--> [New 2nd Post]--`