La rappresentazione di un elenco ordinato è uno dei problemi difficili con i database relazionali. L'aggiunta di una proprietà position alla relazione elenco-appartenenza è il modo più comune per farlo, poiché è possibile recuperare facilmente l'elenco ordinato aggiungendo ORDER BY position
alla query SQL e poiché è possibile inserire facilmente elementi al centro dell'elenco facendo la media del valori del membro di elenco precedente e successivo, supponendo che la posizione sia un float anziché un numero intero.
L'uso di elenchi doppiamente collegati dovrebbe essere evitato, poiché è facile rendere inavvertitamente i collegamenti incoerenti e finire invece con un grafico o un albero ciclico.
Tuttavia, le API RESTful non soffrono delle restrizioni dei database relazionali. Puoi semplicemente fare qualcosa che sembra naturale, piuttosto che usare un hack come una proprietà position.
Se nell'elenco sono presenti solo poche centinaia di elementi, è sufficiente trasferire l'intero elenco in una richiesta. Supponendo di voler riordinare [1, 2, 3, 4]
dove i membri dell'elenco sono ID, potremmo
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
Il back-end potrebbe quindi tradurlo in qualsiasi tecnologia di database in uso, ma l'utente dell'API non deve considerare questi dettagli.
Se l'elenco è grande e gli articoli vengono normalmente richiesti singolarmente, puoi consentire un indice nell'URL:
GET /page/7
Se ti piacciono gli HATEOAS, la risposta può includere collegamenti precedente / successivo per semplificare la navigazione, se la risorsa viene normalmente consumata in questo modo. Tuttavia, ciò non implica che il database contenga anche questo elenco doppiamente collegato.
Se l'elenco è molto grande, potresti voler esporre ArrayList
operazioni simili a come insert
o push
/ append
. Potrei immaginare una chiamata come
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
Se il riordino è un caso d'uso comune e il riordino deve essere eseguito immediatamente, è possibile offrire un endpoint appropriato nell'API:
POST /url/of/the/list/reorder-item?from=783;to=1357
Se l'elenco riordinato deve essere eseguito in modo esplicito, sarà più semplice trasferire il nuovo ordine come documento JSON, vedere sopra.
Ora non è del tutto vero che è possibile visualizzare l'API come completamente separata dalla tecnologia di database che si sta utilizzando. Tuttavia, è meglio mantenere l'API esterna il più libera possibile dai dettagli di implementazione. Se un riordino tocca circa 30 righe solo per aggiornare una colonna di ordine intero, non è un grosso problema. Fai solo la cosa più semplice possibile e aggiorna sempre l'intero elenco. Se la tua bilancia richiede che il tuo database sia più sofisticato, preferisci catturare questa raffinatezza nel backend, dove è più facile mantenere la coerenza.