RESTful API相关对象&非规范化(MongoDB)

时间:2013-02-02 17:49:45

标签: mongodb rest database-design architecture denormalization

我正在使用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?如果' John'不喜欢玛丽'了。服务器只接收以下put请求。

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

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

我的想法:

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

2。让客户端同时发送原始'喜欢'并且' isLikedBy'字段以及新更新的字段(或仅差异)。这似乎远离RESTful设计,因为客户端现在必须知道上次成功保存到服务器的数据。

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

我该怎么办?

1 个答案:

答案 0 :(得分:2)

在使用Mongo和跟踪喜欢的时候,我们在公司里遇到了同样的问题。

经过多次讨论后,我们决定用实体存储喜欢的数量 - 在这种情况下,存储喜欢的人。

关于您的选择的意见:

  1. 执行其他查询的开销可能不是一个好主意。特别是因为“喜欢”的东西被用户视为轻量级操作。换句话说,你可能会发现用户喜欢大量的东西,这意味着大量的写入 - 在这种情况下,每次写入都会有一两次读取。

  2. 这对开发人员来说是很多工作,很容易出错。

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

  4. 我认为您应该使用人员文档存储喜欢/喜欢的字段。我唯一要改变的就是正在进行的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调用时,更新都不必更新整个文档。您可以使用修改后的喜欢对“个人”文档进行部分更新。您还可以在文档中轻松添加/删除数组。