2

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

  • _ID
  • 用户名
  • 密码
  • ...(更多基本数据)
  • 朋友们
  • 信誉积分
  • 声望点历史
  • 通知
  • 已加入的用户组

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

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

通知和历史记录也是如此。和朋友有同样的问题,但是这些情况下数组的大小可能会大很多,所以使用新集合的想法更强烈。

4

1 回答 1

2

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

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

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

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

于 2012-09-10T15:08:13.763 回答