1

我正在使用 node.js 和 MongoDB 构建一个 RESTful Web 应用程序。

我有一个人模型

Person
  id:         '12345'
  name:       'John'
  likes:      [ {id: '54321', name: 'Mary'} ]
  isLikeydBy: []


Person
  id:         '54321'
  name:       'Mary'
  likes:      []
  isLikeydBy: [ {id: '12345', name: 'John'} ]

模拟“喜欢”和“isLikedBy”关系的最佳方式是什么?由于我使用的是 MongoDB,我认为这是对关系建模的好方法,因为只需一次访问数据库即可获取有关一个人的所有数据。

如何为这种关系创建一个 REST api?如果“约翰”不再喜欢“玛丽”怎么办。服务器只接收到下面的 put 请求。

  Person
  id:         '12345'
  name:       'John'
  likes:      []
  isLikeydBy: []

但是服务器也应该更新“玛丽”,因为现在她不再被“约翰”喜欢了。(我知道 MongoDB 不直接支持事务,我必须自己实现它们。)

我的想法:

1.每次更新 Person(它的 'likes' 和 'isLikedBy' 字段)时,从数据库中获取此人并将他们的 'likes' 和 'isLikedBy' 字段与请求进行比较。这种方法有一些开销,而且我不知道它是否符合 RESTful API 的精神。

2.让客户端发送原始的 'likes' 和 'isLikedBy' 字段以及新更新的字段(或仅发送 diff)。这似乎与 RESTful 设计相去甚远,因为客户端现在必须知道哪些数据最后一次成功保存到服务器。

3.创建一个包含关系信息的单独对象(3 个字段:id、me、whoILike)。但这意味着每次我想要获取有关某人的数据时,我都需要 2 个查询,一个用于该人,一个用于关系,然后将数据组合成一个对象。

我应该怎么办?

4

1 回答 1

2

在我的公司使用 Mongo 和跟踪点赞时,我们也遇到过同样的问题。

经过多次讨论,我们决定将点赞数与实体一起存储——在这种情况下,将点赞数与人一起存储。

对您的选择的意见:

  1. 进行额外查询的开销可能是个坏主意。特别是因为“喜欢”的东西被用户视为轻量级操作。换句话说,您可能会发现用户喜欢大量的东西,这意味着大量的写入——在这种情况下,每次写入都会附带一两次额外的读取。

  2. 这是开发人员要做的大量工作,而且很容易出错。

  3. 我觉得没关系,但我还是更喜欢和这个人一起存储喜欢的东西。Mongo 不像你提到的那样擅长加入。

我认为您应该将喜欢/喜欢的字段与个人文档一起存储。我唯一要改变的是正在进行的 REST 调用。

也许是这样的:

PUT http://www.rest.com/person/123/likes/456

这会说“人 123 喜欢 456”。然后您的 REST 调用确保数据已更新。它将更新 Person 123 对象Person 456 对象。

删除类似的东西:

DELETE http://www.rest.com/person/123/likes/456

请记住,每次有人进行 REST 调用时,更新不必更新整个文档。您可以使用修改后的喜欢对 Person 文档进行部分更新。您还可以轻松地在文档中添加/删除数组。

于 2013-02-03T04:33:55.737 回答