我是 noSQL 数据库(MongoDB)的新手,我不知道如何组织集合。我有一个用户系统,每个用户都拥有:
- _id
- Username
- Password
- ... (more basic data)
- Friends
- Reputation points
- History of the reputation points
- Notifications
- User groups that has joined
基本数据通常存储在users集合中,但我不知道如何存储像 friend 列表这样的复杂数据。
我应该在每个用户对象(用户集合内)中存储 friend (如 _id 数组),还是应该创建一个新集合来仅存储 friend ?如果我创建这个新集合,它应该类似于用户的 _id 及其 friend 的数组,或者像 user =>friend _id 这样的对。
通知和历史记录也是如此。这和我和 friend 遇到的问题是一样的,但是这些情况下数组的大小可能要大得多,所以使用新集合的想法更强烈。
最佳答案
我假设您正在创建某种社交网络,其中每个用户的 friend 都是其他用户。
在 MongoDB 中通常应避免仅表示文档之间关系的集合。在关系数据库中,您可以使用它们来连接表,但 MongoDB 不支持连接。
您应该为每个用户添加一组 friend 。这是在 MongoDB 中实现多对多关系的常用方法。但是因为您有一个关系而不是聚合( friend 不属于用户 - 它们独立存在),所以您不应该将整个 friend 对象放入这些数组中。相反,您应该使用可用于在用户集合中查找 friend 的唯一标识符。这可以是 friend 的 _id,即 DBRef或 friend 的姓名(仅当这些信息是唯一且已编入索引时)。后一种解决方案将允许您获取用户 friend 的可读列表,而无需请求所有引用的文档。
通知是一个反例,其中将整个对象存储在用户文档中是有意义的。通知将发送给单个用户。如果没有用户,通知就没有意义。如果没有收到通知的用户,您将永远不需要通知。当用户被删除时,其通知也可以随之删除。因此您可以将其直接存储在用户文档中。
关于javascript - 如何组织用户系统的 Mongo 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353812/