順序付きリストを表すことは、リレーショナルデータベースの難しい問題の1つです。位置プロパティをリストメンバーシップリレーションに追加するのが最も一般的な方法ですORDER BY position
。SQLクエリに追加することで順序付きリストを簡単に取得でき、平均化することでリストの中央にアイテムを簡単に挿入できるからです。位置が整数ではなく浮動小数点であると仮定して、前および後のリストメンバーの値。
誤ってリンクを矛盾させてしまい、代わりに周期的なグラフやツリーができてしまうので、二重にリンクされたリストの使用は避けるべきです。
ただし、RESTful APIは、リレーショナルデータベースの制限の影響を受けません。位置プロパティのようなハックを使用するのではなく、自然に感じる何かを行うことができます。
リストに要素が数百個しかない場合は、リクエストでリスト全体を転送するだけです。[1, 2, 3, 4]
リストのメンバーがIDである場所を並べ替えると仮定すると、
POST /url/of/the/list
Content-type: application/json
...
[1, 2, 4, 3]
バックエンドはこれを使用しているデータベーステクノロジーに変換しますが、APIユーザーはこれらの詳細を考慮する必要はありません。
リストが大きく、アイテムが通常個別に要求される場合、URLでインデックスを許可できます。
GET /page/7
HATEOASを使用している場合、リソースが通常そのように消費される場合、ナビゲーションに簡単にするために、応答にprev / nextリンクを含めることができます。ただし、データベースにこの二重リンクリストも含まれていることを示す必要はありません。
リストが非常に大きい場合、または/ ArrayList
などのような操作を公開することができます。次のような呼び出しを想像できますinsert
push
append
POST /url/of/the/list?at=1357;mode=insert
...
description of the item to insert
並べ替えが一般的なユースケースであり、並べ替えをすぐにコミットする必要がある場合は、APIで適切なエンドポイントを提供できます。
POST /url/of/the/list/reorder-item?from=783;to=1357
並べ替えられたリストを明示的にコミットする必要がある場合、新しい注文をJSONドキュメントとして転送する方が簡単です。上記を参照してください。
現在、APIを、使用しているデータベーステクノロジーとは完全に分離していると見なすことはできません。ただし、実装の詳細から外部APIをできるだけ自由に保つことをお勧めします。整数の順序列を更新するためだけに並べ替えが約30行行われる場合、それは大したことではありません。できるだけ簡単なことを行い、常にリスト全体を更新してください。スケールでデータベースの使用をより高度にする必要がある場合は、一貫性を維持しやすいバックエンドでこの洗練度をキャプチャすることをお勧めします。