La représentation d'une liste ordonnée est l'un des problèmes difficiles des bases de données relationnelles. L'ajout d'une propriété de position à la relation liste-appartenance est le moyen le plus courant de le faire, car vous pouvez facilement récupérer la liste ordonnée en l'ajoutant ORDER BY position
à votre requête SQL et parce que vous pouvez facilement insérer des éléments au milieu de la liste en faisant la moyenne de la valeurs du membre de liste précédent et suivant, en supposant que la position est un flottant plutôt qu'un entier.
L'utilisation de listes doublement liées doit être évitée, car il est facile de rendre accidentellement les liens incohérents et de se retrouver avec un graphique ou un arbre cyclique à la place.
Cependant, les API RESTful ne souffrent pas des restrictions des bases de données relationnelles. Vous pouvez simplement faire quelque chose qui semble naturel, plutôt que d'utiliser un hack comme une propriété de position.
Si vous n'avez que quelques centaines d'éléments dans la liste, transférez simplement la liste entière dans une demande. En supposant que nous voulons réorganiser [1, 2, 3, 4]
où les membres de la liste sont des identifiants, nous pourrions
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
Le backend peut ensuite traduire cela dans la technologie de base de données que vous utilisez, mais l'utilisateur de l'API n'a pas à prendre en compte ces détails.
Si la liste est grande et que les éléments sont généralement demandés individuellement, vous pouvez autoriser un index dans l'url:
GET /page/7
Si vous êtes dans HATEOAS, la réponse peut inclure des liens précédent / suivant pour simplifier la navigation, si la ressource est généralement consommée comme ça. Cependant, cela ne signifie pas nécessairement que votre base de données contient également cette liste doublement liée.
Si la liste est très volumineuse, vous souhaiterez peut-être exposer des ArrayList
opérations similaires à / insert
ou . Je pourrais imaginer un appel commepush
append
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
Si la réorganisation est un cas d'utilisation courant et que la réorganisation doit être validée immédiatement, vous pouvez proposer un point de terminaison approprié dans votre API:
POST /url/of/the/list/reorder-item?from=783;to=1357
Si la liste réorganisée doit être validée explicitement, il sera plus facile de transférer la nouvelle commande en tant que document JSON, voir ci-dessus.
Maintenant, ce n'est pas tout à fait vrai que vous pouvez voir votre API comme complètement séparée de la technologie de base de données que vous utilisez. Cependant, il est préférable de garder l'API externe aussi libre que possible des détails d'implémentation. Si une réorganisation touche environ 30 lignes juste pour mettre à jour une colonne d'ordre entier, ce n'est pas grave. Faites simplement la chose la plus simple possible et mettez toujours à jour toute la liste. Si votre évolutivité nécessite une utilisation plus sophistiquée de votre base de données, préférez capturer cette sophistication dans le backend, où il est plus facile de maintenir la cohérence.