Representar una lista ordenada es uno de los problemas difíciles con las bases de datos relacionales. Agregar una propiedad de posición a la relación lista-membresía es la forma más común de hacerlo, ya que puede recuperar fácilmente la lista ordenada agregando ORDER BY position
a su consulta SQL, y porque puede insertar fácilmente elementos en el medio de la lista promediando el valores del miembro de la lista anterior y posterior, suponiendo que la posición es flotante en lugar de entero.
Se debe evitar el uso de listas doblemente vinculadas, ya que es fácil hacer que los enlaces sean inconsistentes accidentalmente y terminar con un gráfico o árbol cíclico.
Sin embargo, las API RESTful no sufren las restricciones de las bases de datos relacionales. Puedes hacer algo que se siente natural, en lugar de usar un truco como una propiedad de posición.
Si solo tiene unos pocos cientos de elementos en la lista, simplemente transfiera la lista completa en una solicitud. Suponiendo que queremos reordenar [1, 2, 3, 4]
donde los miembros de la lista son ID, podríamos
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
El backend puede traducir esto a cualquier tecnología de base de datos que esté utilizando, pero el usuario de la API no tiene que considerar estos detalles.
Si la lista es grande y los artículos generalmente se solicitarían individualmente, puede permitir un índice en la URL:
GET /page/7
Si está interesado en HATEOAS, la respuesta puede incluir enlaces prev / next para simplificar la navegación, si el recurso generalmente se consumiría así. Sin embargo, esto no implica necesariamente que su base de datos también contenga esta lista doblemente vinculada.
Si la lista es muy grande, es posible que desee exponer ArrayList
operaciones similares como insert
o push
/ append
. Podría imaginar una llamada como
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
Si el reordenamiento es un caso de uso común y el reordenamiento debe confirmarse de inmediato, entonces podría ofrecer un punto final apropiado en su API:
POST /url/of/the/list/reorder-item?from=783;to=1357
Si la lista reordenada debe confirmarse explícitamente, será más fácil transferir el nuevo pedido como un documento JSON, ver arriba.
Ahora no es del todo cierto que pueda ver su API completamente separada de la tecnología de base de datos que está utilizando. Sin embargo, es mejor mantener la API externa lo más libre posible de los detalles de implementación. Si alguna reordenación toca unas 30 filas solo para actualizar una columna de orden de enteros, no es gran cosa. Simplemente haga lo más simple posible y actualice siempre la lista completa. Si su báscula requiere que el uso de su base de datos sea más sofisticado, prefiera capturar esta sofisticación en el backend, donde es más fácil mantener la coherencia.