sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo permitir que un usuario inserte en cualquier lugar de una lista?

El método más simple desde el punto de vista del código es usar un estilo de lista enlazada, donde tiene una identificación de elemento siguiente, en lugar de un valor de pedido. Esto es menos útil en listas pequeñas, pero cuando comienza a aumentar el tamaño de la lista, hace que las actualizaciones/movimientos/eliminaciones sean mucho más limpias y evita que posiblemente se actualicen miles de tuplas para hacer 1 cambio de orden.

++ No tengo un ejemplo de código exacto a mano, pero haría una llamada para todas las listas de un usuario

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;

Esto obtendría todas las publicaciones de un solo usuario, y luego tendría un campo que contiene la identificación de la siguiente publicación. Para comenzar, necesitaría una clave para identificar la primera publicación (almacene la identificación de la primera publicación en la información del usuario). Después de extraer la primera publicación, selecciona su valor 'siguiente' y lo usa para identificar la siguiente publicación.

Esto parece un poco loco para una lista corta, pero piensa en un usuario con 1000 publicaciones. Si necesitan agregar 1 publicación en la 2da posición. En un sistema de ordenamiento numérico tradicional, ahora necesitaría actualizar otras 999 filas con una actualización de +1. Con esta solución, si necesita insertar una publicación en la segunda posición, simplemente consulta la primera publicación para obtener su siguiente valor. Una vez que lo tenga, cámbielo para que sea el valor de la nueva segunda publicación y configure el siguiente valor de la segunda publicación para que sea el que tenía originalmente la primera.

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

Después de insertar:

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