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

¿Cuál es la forma más eficiente de almacenar un orden de clasificación en un grupo de registros en una base de datos?

¿Qué tal si simplemente usamos un integer? columna que define el orden? De manera predeterminada, asigna números * 1000, como 1000, 2000, 3000... y si mueve 3000 entre 1000 y 2000, lo cambia a 1500. Por lo tanto, en la mayoría de los casos, no necesita actualizar los otros números. Yo uso este enfoque y funciona bien. También puedes usar double pero entonces no tienes control sobre la precisión y los errores de redondeo, así que mejor no lo uses.

Así se vería el algoritmo :supongamos que mueve B a la posición después de A. Primero realice la selección para ver el orden del registro al lado de A. Si es al menos +2 más alto que el orden de A, entonces simplemente establece el orden de B para que quepa en el medio. Pero si es solo +1 más alto (no hay espacio después de A), selecciona los registros que bordean B para ver cuánto espacio hay en este lado, divide por 2 y luego agrega este valor al orden de todos los registros entre A y B. ¡Eso es todo!

(Tenga en cuenta que debe usar transacción/bloqueo para cualquier algoritmo que contenga más de una sola consulta, por lo que esto también se aplica a este caso. La forma más fácil es usar la transacción InnoDB).