使用MongoDB在两个用户之间建立类似Facebook的聊天/讨论

时间:2014-01-25 18:03:49

标签: mongodb data-modeling

我正在尝试使用MongoDB在两个用户之间建模类似FB的聊天/讨论。

我为消息

提出了以下BSon“结构”
  {
    _id: ObjectId(...),
    discussionId: ObjectId(...),
    from: {
       id: ObjectId(...), 
       nickname: ‘Joe’,
       thumbnail: ‘xoopp7788ee….jpg’
     },
    to: {
       id: ObjectId(...), 
       nickname: ‘Jane’,
       thumbnail: ‘rtolkj96547cc….jpg’
     },
    text: ‘Hello Jane, How are you today?’,
    posted: ISODateTime(...),
    viewed: ISODateTime(...),
    next: ObjectId(...),
    previous: ObjectId(...) 
  }

我确实阅读了following mongodb documentation,但我仍然想提交我的问题,因为我的模型/问题略有不同。

首先,我不确定nextprevious字段是否必要。我可以只使用posted字段来线程消息吗?

其次,每条消息只能有一个文档会造成性能问题吗?每个文档有几条消息可以让我更好吗?

我期待着阅读您的意见和建议。

edit1 discussionId会以某种方式成为两个用户组合的唯一ID ...

1 个答案:

答案 0 :(得分:3)

IMHO:

  • thumbnail如果它引用了头像,则应该在用户个人资料中。如果这是一个笑脸,那么它应该与text处于同一水平。
  • 如果from.id是用户ID,那么为了节省空间,您无需重复nickname。它可以在UI中“注入”,也可以在需要时将其发送到某个地方。有时复制数据可能很有用,但在这种情况下它是可疑的。
  • 每次讨论时,
  • discussion集合可能已经有fromto。在这种情况下,您不必在每条消息中重复用户ID。您只能保留from
  • 如果有两个以上的人讨论某些内容 - 群聊,则fromto不起作用。您可能必须制作2个fromto数组。这取决于您的聊天类型。
  • nextprevious:通常我不会拥有它们。您可以在discussionId, from.id, to.id找到讨论主题并按posted对其进行排序。除非你有一些非常奇怪的聊天方式,否则你可以删除这两个字段。
  • posted有一个日期,没关系,但是如果你想保存更多的空间,日期也存储在_id中,这样你就可以避免创建索引并存储额外的字段。
  • 最终,如果您决定删除nicknamethumbnail,那么您可以将from.id升级为fromId
总的来说它看起来不错。我只是在为性能和小改进而挑剔。