Reprezentacja uporządkowanej listy jest jednym z trudnych problemów z relacyjnymi bazami danych. Dodanie właściwości pozycji do relacji lista-członkostwo jest najczęstszym sposobem, aby to zrobić, ponieważ można łatwo odzyskać uporządkowaną listę, dodając ORDER BY position
do zapytania SQL oraz ponieważ można łatwo wstawiać elementy na środku listy, uśredniając wartość wartości poprzedniego i następnego elementu listy, przy założeniu, że pozycja jest liczbą zmiennoprzecinkową, a nie liczbą całkowitą.
Należy unikać korzystania z podwójnie połączonych list, ponieważ łatwo jest przypadkowo sprawić, że linki będą niespójne, a zamiast tego powstanie cykliczny wykres lub drzewo.
Jednak interfejsy API RESTful nie podlegają ograniczeniom relacyjnych baz danych. Możesz po prostu zrobić coś, co wydaje się naturalne, zamiast używać hacka, takiego jak właściwość position.
Jeśli masz tylko kilkaset elementów na liście, po prostu przenieś całą listę w żądaniu. Zakładając, że chcemy zmienić kolejność [1, 2, 3, 4]
identyfikatorów członków listy, moglibyśmy
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
Backend może następnie przetłumaczyć to na dowolną używaną technologię baz danych, ale użytkownik interfejsu API nie musi brać pod uwagę tych szczegółów.
Jeśli lista jest duża, a elementy zwykle są zamawiane osobno, możesz zezwolić na indeks w adresie URL:
GET /page/7
Jeśli lubisz HATEOAS, odpowiedź może zawierać linki poprzedni / następny, aby uprościć nawigację, jeśli zasób byłby zwykle tak konsumowany. Nie musi to jednak oznaczać, że baza danych zawiera również podwójnie połączoną listę.
Jeśli lista jest bardzo duża, możesz chcieć ujawnić ArrayList
operacje podobne do ujawnienia , takie jak insert
lub push
/ append
. Mogę sobie wyobrazić takie połączenie
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
Jeśli zmiana kolejności jest częstym przypadkiem użycia, a zmiana kolejności powinna zostać wykonana natychmiast, możesz zaoferować odpowiedni punkt końcowy w interfejsie API:
POST /url/of/the/list/reorder-item?from=783;to=1357
Jeśli lista uporządkowana zostanie wyraźnie zatwierdzona, łatwiej będzie przenieść nowe zamówienie jako dokument JSON, patrz wyżej.
Teraz nie jest do końca prawdą, że możesz postrzegać swój interfejs API jako całkowicie odrębny od używanej technologii baz danych. Jednak najlepiej zachować zewnętrzny interfejs API tak wolny, jak to możliwe od szczegółów implementacji. Jeśli jakakolwiek zmiana kolejności dotyka około 30 wierszy tylko w celu zaktualizowania kolumny zamówienia z liczbą całkowitą, to nic wielkiego. Po prostu zrób najprostszą możliwą rzecz i zawsze aktualizuj całą listę. Jeśli Twoja skala wymaga bardziej zaawansowanego użycia bazy danych, wolisz przechwytywać to wyrafinowanie w backendie, gdzie łatwiej jest zachować spójność.