【问题标题】:RESTful API related objects & denormalization (MongoDB)RESTful API 相关对象和非规范化 (MongoDB)
【发布时间】:2013-01-17 20:24:05
【问题描述】:

我正在使用 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'} ]

建模“likes”和“isLikedBy”关系的最佳方法是什么?由于我使用的是 MongoDB,我认为这是一种建模关系的好方法,因为只有一个访问权限到获取有关一个人的所有数据所需的数据库。

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

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

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

我的想法:

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

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

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

我该怎么办?

【问题讨论】:

    标签: mongodb rest database-design architecture denormalization


    【解决方案1】:

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

    经过多次讨论,我们决定将点赞数与实体一起存储 - 在本例中,将点赞数与人一起存储。

    对您的选择的意见:

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

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

    3. 我认为这还可以,但我还是更喜欢与此人一起存储喜欢的内容。像你提到的那样,Mongo 并不擅长加入。

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

    可能是这样的:

    PUT @987654321@

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

    要删除类似的东西:

    DELETE @987654322@

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

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 1970-01-01
      • 2013-07-03
      • 2021-05-31
      • 2016-05-01
      • 2020-05-06
      • 2021-06-13
      • 2011-10-24
      • 2012-12-31
      相关资源
      最近更新 更多