表示有序列表是关系数据库的难题之一。将位置属性添加到列表成员关系是最常见的方法,因为您可以通过添加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行,只是为了更新整数列,那没什么大不了的。只要做最简单的事情,就总是更新整个列表。如果您的规模要求数据库使用更加复杂,则最好在后端维护这种复杂性,因为后端更易于保持一致性。