Representar uma lista ordenada é um dos problemas difíceis nos bancos de dados relacionais. Adicionar uma propriedade position à relação lista-associação é a maneira mais comum de fazer isso, pois você pode recuperar facilmente a lista ordenada adicionando ORDER BY position
à sua consulta SQL e porque é possível inserir itens facilmente no meio da lista calculando a média do valores do membro da lista anterior e subseqüente, assumindo que a posição é um ponto flutuante em vez de inteiro.
O uso de listas duplamente vinculadas deve ser evitado, pois é fácil acidentalmente tornar os links inconsistentes e terminar com um gráfico ou árvore cíclica.
No entanto, as APIs RESTful não sofrem com as restrições dos bancos de dados relacionais. Você pode simplesmente fazer algo que pareça natural, em vez de usar um hack como uma propriedade position.
Se você tiver apenas algumas centenas de elementos na lista, basta transferir a lista inteira em uma solicitação. Supondo que queremos reorganizar [1, 2, 3, 4]
onde os membros da lista são IDs, poderíamos
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
O back-end pode traduzi-lo para qualquer tecnologia de banco de dados que você estiver usando, mas o usuário da API não precisa considerar esses detalhes.
Se a lista for grande e os itens geralmente forem solicitados individualmente, você poderá permitir um índice no URL:
GET /page/7
Se você gosta do HATEOAS, a resposta pode incluir links anteriores / próximos para simplificar a navegação, se o recurso normalmente for consumido dessa maneira. No entanto, isso não significa que seu banco de dados também contenha essa lista duplamente vinculada.
Se a lista for muito grande, convém expor ArrayList
operações do tipo como insert
ou push
/ append
. Eu poderia imaginar uma ligação como
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
Se a reordenação for um caso de uso comum e a reordenação for confirmada imediatamente, você poderá oferecer um ponto de extremidade apropriado em sua API:
POST /url/of/the/list/reorder-item?from=783;to=1357
Se a lista reordenada deve ser confirmada explicitamente, será mais fácil transferir o novo pedido como um documento JSON, veja acima.
Agora não é bem verdade que você pode ver sua API completamente separada da tecnologia de banco de dados que está usando. No entanto, é melhor manter a API externa o mais livre possível dos detalhes da implementação. Se alguma reordenação tocar cerca de 30 linhas apenas para atualizar uma coluna de pedido inteiro, isso não é grande coisa. Basta fazer a coisa mais simples possível e sempre atualizar a lista inteira. Se sua escala exigir que o uso do banco de dados seja mais sofisticado, prefira capturar essa sofisticação no back-end, onde é mais fácil manter a consistência.