Tengo una colección de objetos en una base de datos. Imágenes en una galería de fotos, productos en un catálogo, capítulos en un libro, etc. Cada objeto se representa como una fila. Quiero poder ordenar estas imágenes de forma arbitraria, almacenando ese orden en la base de datos para que cuando muestre los objetos, estén en el orden correcto.Representación de pedidos en una base de datos relacional
Por ejemplo, digamos que estoy escribiendo un libro, y cada capítulo es un objeto. Escribo mi libro, y poner los capítulos en el orden siguiente:
Introducción, Accesibilidad, Formulario contra la función, errores, consistencia, Conclusión, Índice
Se va al editor, y viene de vuelta con el siguiente orden sugerido:
Introducción, forma, función, Accesibilidad, consistencia, errores, Conclusión, Índice
¿Cómo puedo almacenar este pedido en la base de datos de una manera robusta y eficiente?
he tenido las siguientes ideas, pero no estoy encantada con cualquiera de ellos:
matriz. Cada fila tiene una ID de pedido, cuando se cambia la orden (a través de una eliminación seguida de una inserción), se actualizan las ID de la orden. Esto facilita la recuperación, ya que es solo
ORDER BY
, pero parece fácil de romper.// REMOVAL
UPDATE ... SET orderingID=NULL WHERE orderingID=removedID
UPDATE ... SET orderingID=orderingID-1 WHERE orderingID > removedID
// INSERTION
UPDATE ... SET orderingID=orderingID+1 WHERE orderingID > insertionID
UPDATE ... SET orderID=insertionID WHERE ID=addedID
lista enlazada. Cada fila tiene una columna para el ID de la siguiente fila en el orden. El recorrido parece costoso aquí, aunque es posible que de alguna manera use
ORDER BY
en el que no estoy pensando.matriz espaciada. Establezca el orderingID (como se usa en # 1) para que sea grande, de modo que el primer objeto sea 100, el segundo sea 200, etc. Luego, cuando ocurra una inserción, simplemente colóquelo en
(objectBefore + objectAfter)/2
. Por supuesto, esto debería reequilibrarse de vez en cuando, para que no tenga cosas muy juntas (incluso con flotadores, eventualmente se encontraría con errores de redondeo).
Ninguno de estos parece particularmente elegante para mí. ¿Alguien tiene una mejor manera de hacerlo?
+1 por mencionar la numeración dispersa. He usado la gema [rank-model] (https://github.com/mixonic/ranked-model) para esto en el pasado. –