3

我正在尝试为应用程序编写 REST 接口。

该模型

在这个应用程序的模型中,我已经遇到了如下情况:

  • 一个人可以有多项活动。
  • 一个活动可以由几个人推荐。
  • 人们的活动按照特定的领域(位置)进行排序。

我在我的数据库中用三个表表示了这种情况:人员、活动、人员活动。表 people_activities 包含三个字段:person_id、activity_id、位置。

新要求

到目前为止一切正常,但现在我有一个新要求,我应该能够在其他人之上插入一个人的活动。

因此,如果 people_activities 表的内容是例如这个:

“标记读数 0” “标记运行 1”

如果我收到添加“标记杂耍”的请求,结果应该是:

“标记杂耍 0” “标记阅读 1” “标记跑步 2”

解决方案

REST 接口的困境现在来自我只确定两个选项的事实:

  • 使用像 /people/mark/addActivity 这样的单个 URL,但这似乎一点也不平静,因为它修改了 URL 未引用的资源并且包含太多“动词”。
  • 使用我已经在使用的一些 URL(例如 /people/mark/activities 或 /people_activities?person=mark),并将新的更改发布到所有这些资源。在我看来,这似乎很平静,但很草率。

在您看来,处理这种情况的正确方法是什么?有没有我不考虑的第三种选择?

第一次编辑

只是通过更好地思考这些问题,我意识到另一个合理的解决方案是在数据库中以这种情况结束:

“标记杂耍 -1” “标记读数 0” “标记运行 1”

因为这个位置只是一个对我来说没有“真正”价值的数字。在实践中我不能这样做,但它看起来像是一种宝贵的信息,也是一种在不修改其他关联的情况下添加新资源的方法,从我的业务逻辑的角度来看,这不是我需要做的事情。

也许另一个错误是我让太多的数据库数据溢出我的界面。在这种情况下,从业务角度来看,我真正需要的是元素的顺序,而不是它们的位置。位置的东西只是我在数据库中用来完成排序的一个技术细节。

所以另一个问题可能是:

  • 如果这些信息只是技术细节并且没有暴露给界面用户,那么您认为修改数据库中的某些信息是否合理?
4

1 回答 1

2

我认为您插入位置为的新实体的解决方案min(position) - 1听起来不错。

我们还希望构建一个由 SQL 数据库支持的 RESTful API,该 API 允许对资源进行重新排序,并且遇到了如何在列表的开头或中间添加新条目的实现细节的问题,而不必更新所有实体中的位置。

在我们的实现中,我们计划对字段使用浮点数position并计划遵循以下规则:

  • 如果用户想将实体插入到列表的开头,请position插入min(position) - 1.0
  • 如果用户想将实体插入到列表的末尾,插入position一个max(position) + 1.0
  • 如果用户想在其他任何地方插入实体,请插入position等于position任一侧两个实体的 s 的平均值。

使用我们使用的技术,我们在需要重新平衡之前在两个实体之间获得 1073 次插入,方法是将所有实体中的位置字段更新为彼此间隔1.0开。这对我们的用例来说很好。

旁注:使用图形数据库,您就没有这个问题。只需更新两侧节点的两个关系,就可以很容易地在列表中的任何位置添加新实体,就像在链接列表中插入某些内容一样。因此,如果您未绑定到 SQL 数据库,则需要考虑其他问题

以上都是实现细节。关于 API 对最终用户的看法,我会投票让它看起来对您的客户来说是最简单的。在我们的用例中,我希望我们使position字段显示为基于 0 的整数索引(就像数组一样),因为这对我们的客户来说是最简单的。这意味着在列表的开头插入一个新实体会使position所有其他实体中的字段看起来都发生了变化,但我认为这很好。它并没有过多地违背 REST 哲学。这是务实的。

于 2013-07-29T18:56:51.293 回答