如何为Meteor构建mongodb

如何为Meteor构建mongodb,mongodb,meteor,Mongodb,Meteor,我对Meteor还很陌生,我正试图弄清楚如何实现一些用例。其中之一是投票申请。假设您有几个用户可以在几个投票中投票(为简单起见,假设投票仅限于是/否问题)。 每次使用只能投票一次 在SQL中,我将在3个表中对此进行规范化: USER (id/name) VOTES (user_id/poll_id/choice) POLLS (id/question) 然而,在mongodb的文档存储世界中,似乎鼓励将选票与投票一起存储在一个集合中,如下所示: [ { _id: 1234

我对Meteor还很陌生,我正试图弄清楚如何实现一些用例。其中之一是投票申请。假设您有几个用户可以在几个投票中投票(为简单起见,假设投票仅限于是/否问题)。 每次使用只能投票一次

在SQL中,我将在3个表中对此进行规范化:

USER (id/name)
VOTES (user_id/poll_id/choice)
POLLS (id/question)
然而,在mongodb的文档存储世界中,似乎鼓励将选票与投票一起存储在一个集合中,如下所示:

[
  {
    _id: 1234
    question: "the question"
    votes:
    [
      {
        user_id: 1
        choice: 1
      }
    ]
  }
]
如果用户对投票进行投票,则将在投票的投票数组中插入一个项目。服务器端必须验证用户是否尚未投票。 为了获得总分,我必须对投票进行迭代,但当然,这可以通过在每个投票上创建一个包含聚合分数的字段来改进,该字段会随着投票的添加而更新

但是,这如何传播到其他用户?假设投票被添加到投票中。是否将整个轮询对象发送到其他连接的客户端?因为如果有很多人或投票,投票数组可能会变大,并会造成大量流量

但在这种情况下,当管理员用户更改问题(因此将轮询对象的新版本写入集合)时,要么更新查询需要知道它只应更新所选字段。或者,如果覆盖整个对象,管理员用户应该拥有该对象的最新版本(因为meteor是最后一次写入)


我是否遗漏了一些与此相关的最佳实践,或者是否确实更容易像建模规范化SQL DB一样对我的集合进行建模?

对数据进行非规范化肯定有利弊。因此,为了总结这两个选项,您可以创建一个单独的投票集合,或者只在投票集合中包含投票

有了一个单独的系列,你肯定会得到一些好处。当使用#each template块在游标(vots.find({pollId:pollId}))上迭代时,如果在数组或对象集合上迭代,则性能非常好

您决定将投票作为对象包含在投票中的一个问题是,DDP仅在文档的最高级别属性上运行。这意味着每次添加投票时,整个“投票”对象都会被发送到下一行

使用单独的集合,还可以获得更好的发布/订阅控制

这就是说,如果你只使用一个单独的集合,你将不得不做一些恼人的事情(如你所提到的)来获得选票计数,即你必须将所有选票发布给客户,以便进行计数


许多开发人员选择了一个混合选项,这将是有一个单独的投票集合,但也嵌入了一些重要的投票属性(如计数)在民意调查集合。这也变得有点烦人,这意味着每次有人投票时,你必须更新两个不同的集合。在这种情况下,我想说你的思路是正确的

Discover Meteor图书以帖子和评论为例,建议对数据进行非规范化,以便(如您在问题中所建议的)在投票中使用voteCount属性进行单独的投票和投票集合

投票时的代码如下所示:

//使用新投票更新投票
更新(vote.pollId,{$inc:{votescont:1}});
投票。插入(投票);


DDP的操作方式是在文档的顶层,因此这意味着如果投票是投票的一个属性,则每次在投票中创建投票时,服务器都会将该投票的整个更新投票列表发送给每个连接的客户端。

请参阅我的答案。我认为使用关系方法(尽管有数据存储)通常是使用meteor的最佳选择。谢谢David。很好的帖子,很高兴听到在mongodb中规范化数据不是罪过。我试图应用mongo哲学,但我所有的数据都是内在关联的。此外,使用嵌入式数据似乎需要我知道如何查询/使用我的数据,而这在很大程度上我还不知道。谢谢。我会买《发现流星》这本书,让自己对流星更舒服一点!谢谢和往常一样,在进入一项新技术时,我对最佳实践有点不确定。但是,就像通常的情况一样,似乎没有什么灵丹妙药,每件事都有其利弊。您描述的混合方法在SQL数据库中非常常见。我试图遵循NoSQL文档数据库的理念,但当我尝试在一些真实世界的用例中使用它们时,尤其是与Meteor结合使用时,它们很容易让我头疼,让我不得不求助于我的旧做法。我很高兴听到这不是一个问题。你会发现,流星最好和最坏的事情之一是,有很多不同的路径相同的结果。快乐流星!