Una necesidad común cuando se usa una base de datos es acceder a los registros en orden. Por ejemplo, si tengo un blog, quiero poder reordenar mis publicaciones en un orden arbitrario. Estas entradas a menudo tienen muchas relaciones, por lo que una base de datos relacional parece tener sentido.
La solución común que he visto es agregar una columna entera order
:
CREATE TABLE AS your_table (id, title, sort_order)
AS VALUES
(0, 'Lorem ipsum', 3),
(1, 'Dolor sit', 2),
(2, 'Amet, consect', 0),
(3, 'Elit fusce', 1);
Luego, podemos ordenar las filas order
para obtenerlas en el orden correcto.
Sin embargo, esto parece torpe:
- Si quiero mover el registro 0 al inicio, tengo que reordenar cada registro
- Si quiero insertar un nuevo registro en el medio, tengo que reordenar cada registro después
- Si quiero eliminar un registro, tengo que reordenar cada registro después de él
Es fácil imaginar situaciones como:
- Dos registros tienen lo mismo
order
- Hay lagunas en los
order
registros entre
Esto podría suceder con bastante facilidad por varias razones.
Este es el enfoque que adoptan aplicaciones como Joomla:
Se podría argumentar que la interfaz aquí es mala, y que en lugar de que los humanos editen números directamente, deberían usar flechas o arrastrar y soltar, y probablemente tenga razón. Pero detrás de escena, está sucediendo lo mismo.
Algunas personas han propuesto usar un decimal para almacenar el orden, de modo que pueda usar "2.5" para insertar un registro entre los registros en el orden 2 y 3. Y aunque eso ayuda un poco, podría decirse que es aún más complicado porque puede terminar con decimales extraños (¿dónde se detiene? 2.75? 2.875? 2.8125?)
¿Hay una mejor manera de almacenar el pedido en una mesa?
orders
y el ddl.