Die Darstellung einer geordneten Liste ist eines der schwierigen Probleme bei relationalen Datenbanken. Das Hinzufügen einer Positionseigenschaft zur Liste-Mitgliedschafts-Beziehung ist die häufigste Methode, da Sie die geordnete Liste einfach abrufen können, indem Sie sie ORDER BY position
zu Ihrer SQL-Abfrage hinzufügen , und weil Sie Elemente einfach in die Mitte der Liste einfügen können, indem Sie den Durchschnitt bilden Werte des vorherigen und nachfolgenden Listenmitglieds, vorausgesetzt, die Position ist eher ein Float als eine Ganzzahl.
Die Verwendung von doppelt verknüpften Listen sollte vermieden werden, da es leicht ist, die Verknüpfungen versehentlich inkonsistent zu machen und stattdessen ein zyklisches Diagramm oder einen zyklischen Baum zu erhalten.
RESTful-APIs leiden jedoch nicht unter den Einschränkungen relationaler Datenbanken. Sie können einfach etwas tun, das sich natürlich anfühlt, anstatt einen Hack wie eine Positionseigenschaft zu verwenden.
Wenn Sie nur bis zu ein paar hundert Elemente in der Liste haben, übertragen Sie einfach die gesamte Liste in einer Anfrage. Angenommen, wir möchten neu anordnen, [1, 2, 3, 4]
wo die Listenmitglieder IDs sind, könnten wir
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
Das Backend kann dies dann in die von Ihnen verwendete Datenbanktechnologie übersetzen, der API-Benutzer muss diese Details jedoch nicht berücksichtigen.
Wenn die Liste groß ist und Elemente normalerweise einzeln angefordert werden, können Sie einen Index in der URL zulassen:
GET /page/7
Wenn Sie sich für HATEOAS interessieren, kann die Antwort vorige / nächste Links enthalten, um die Navigation zu vereinfachen, wenn die Ressource normalerweise so verbraucht wird. Dies muss jedoch nicht bedeuten, dass Ihre Datenbank auch diese doppelt verknüpfte Liste enthält.
Wenn die Liste sehr groß ist, möchten Sie möglicherweise ArrayList
ähnliche Vorgänge wie insert
oder push
/ verfügbar machen append
. Ich könnte mir einen Anruf wie vorstellen
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
Wenn die Neuordnung ein häufiger Anwendungsfall ist und die Neuordnung sofort festgeschrieben werden sollte, können Sie einen geeigneten Endpunkt in Ihrer API anbieten:
POST /url/of/the/list/reorder-item?from=783;to=1357
Wenn die neu geordnete Liste explizit festgeschrieben werden soll, ist es einfacher, die neue Bestellung als JSON-Dokument zu übertragen (siehe oben).
Jetzt ist es nicht ganz richtig, dass Sie Ihre API als völlig unabhängig von der von Ihnen verwendeten Datenbanktechnologie anzeigen können. Es ist jedoch am besten, die externe API so frei wie möglich von Implementierungsdetails zu halten. Wenn eine Neuordnung etwa 30 Zeilen berührt, nur um eine Ganzzahlreihenfolge zu aktualisieren, ist das keine große Sache. Tun Sie einfach das Einfachste und aktualisieren Sie immer die gesamte Liste. Wenn Ihre Skalierung eine komplexere Datenbanknutzung erfordert, ziehen Sie es vor, diese Raffinesse im Backend zu erfassen, wo es einfacher ist, die Konsistenz aufrechtzuerhalten.