如何组织用户系统的Mongo集合

时间:2012-09-10 14:29:56

标签: javascript node.js mongodb

我是noSQL数据库(MongoDB)的新手,我不知道如何组织集合。我有一个用户系统,每个用户都有:

  
      
  • _id
  •   
  • 用户名
  •   
  • 密码
  •   
  • ...(更基本的数据)
  •   
  •   
  • 声誉点
  •   
  • 声誉点的历史
  •   
  • 通知
  •   
  • 已加入的用户组
  •   

基本数据通常存储在用户集合中,但我不知道如何存储像朋友列表这样的复杂数据。

我应该在每个用户对象(用户集合中)中存储像数组这样的朋友,还是应该创建一个新集合来存储朋友?如果我创建这个新集合,它应该像用户的_id和其朋友的数组,或者像user =>这样的对。朋友_id。

通知和历史记录相同。这与我和朋友的问题相同,但在这些情况下,阵列的大小可能要大得多,因此使用新集合的想法更强。

1 个答案:

答案 0 :(得分:2)

我假设您正在创建某种社交网络,其中每个用户的朋友都是其他用户。

MongoDB中通常应避免仅代表文档之间关系的集合。在关系数据库中,您可以使用它们来连接表,但MongoDB不支持连接。

您应该为每个用户添加一个朋友数组。这是在MongoDB中实现多对多关系的常用方法。但是因为你有一个关系而不是聚合(朋友不是拥有的用户 - 他们独立存在)你不应该把整个朋友对象放到这些数组中。而不是你应该使用一个唯一的标识符,可以用来找到用户集合中的朋友。这可以是朋友的_id,DBRef或朋友的名字(仅当这些是唯一的并且被索引时)。后一种解决方案允许您获得用户朋友的可读列表,而无需请求所有引用的文档。

将整个对象存储在用户文档中有意义的反例可以是通知。通知将发送给单个用户。没有用户,通知是没有意义的。如果用户没有收到通知,您将永远不需要通知。删除用户后,可以使用它删除通知。因此,您可以将其存储在用户文档中。