rest:修改与资源关联的资源的顺序

时间:2013-07-29 14:15:51

标签: database rest url symfony doctrine-orm

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

模型

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

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

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

新要求

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

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

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

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

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

解决方案

REST界面的困境现在来自于我只识别两个选项:

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

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

首次修改

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

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

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

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

另外一个问题可能是:

    如果这些信息只是一个技术细节并且没有向接口用户公开,那么
  • 在您的意见中修改数据库中的某些信息是合理的吗?

1 个答案:

答案 0 :(得分:2)

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

我们还希望构建一个由SQL数据库支持的RESTful API,它允许重新排序资源,并且在如何将新条目添加到列表的开头或中间的实现细节中遇到了这个问题无需更新所有实体的头寸。

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

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

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

  

附注:使用图表数据库,您没有此问题。通过更新任意一侧节点的两个关系,就可以非常轻松地在列表中的任何位置添加新实体,就像将内容插入到链接列表中一样。如果您没有绑定到SQL数据库,那么这是另外需要考虑的事情

以上所有内容均为实施细节。关于API应该如何看待最终用户,我会投票让它看起来对你的客户来说最简单。在我们的用例中,我希望我们将position字段显示为基于0的整数索引(就像数组一样),因为这对我们的客户来说是最简单的。这意味着在列表的开头插入一个新实体会使所有其他实体中的position字段看起来发生变化,但我认为没问题。它并没有过多地面对REST哲学。这是务实的。

相关问题