在我的项目中,我有用户和圈子。圈子可以有多个用户,用户可以在多个圈子中。最后还有一些事件。每个活动可以在一个圈子中拥有多个用户。之后,事件将获得大量内容,因此需要加载很多东西(图像,评论等)。
我在想这些是一个很好的数据模型:
User = {
_id: "uuid",
name: "string",
password: "string",
circles: [Circle._id],
}
Event = {
_id: "uuid",
name: "string",
location: "string",
circles:Circle._id,
participants: [User._id],
}
Circle = {
_id: "uuid",
name: "string"
}
一旦用户登录,他/她选择他的一个圈子,将显示该圈子中的用户和事件。
使用这些数据模型的API(我认为)意味着从一个圈子中获取用户和事件,数据库必须搜索所有用户和事件,并检查它们是否在该圈子中。有很多用户和活动,我认为这可能不是最有效的方式吗?
所以我想把用户和事件放到圆圈的数组中,如下所示:
User = {
_id: "uuid",
name: "string",
password: "string",
}
Event = {
_id: "uuid",
name: "string",
location: "string",
participants: [User._id],
}
Circle = {
_id: "uuid",
name: "string",
users:[User._id],
events:[Event._id]
}
现在,当用户选择圆圈时,圆圈加载速度较慢,因为必须先加载用户和事件。但我在想,搜索用户和事件现在会更快。这是正确的方法/思考吗?在用户和事件数据模型中保留对特定圆ID的引用是否有意义?
如果你想充分利用mongoDb,我强烈建议你对数据进行非规范化。
如果您规范化数据,则可能必须使用$ lookup来支持多个集合。即使你节省了硬盘,你最终也会得到相对较重的计算量。
假设应用程序通常将90%的命中率作为读取而10%作为写入,那么以读取友好的方式对数据进行建模是有意义的。因此,高度非规范化您的数据,直到创建对其他集合的引用非常必要。稍后可以通过索引和缓存来实现优化,但请在下面给出一个想法。
User = {
_id: "uuid",
name: "string",
password: "string",
circles: ["circle1","circle2"],
events : ["event1","event2"]
}
Event = {
_id: "uuid",
name: "string",
location: "string"
}
Circle = {
_id: "uuid",
name: "string"
}
事先尝试并了解您的查询,将大部分数据归档到User
集合中。如果要存储更多属性,circles
集合中的events
和User
字段也可以是[{},{}]
对象的数组。
我确信你收集的收藏越多,你的查询就越复杂,计算也就越多。
我不推荐将userId存储在circle
或event
集合中,因为用户可能会随着时间的推移而增长,并且您不希望最终得到一个包含一个存储数千个数组元素的字段的文档的集合。相反,用户可以成为100个圈子和事件的一部分,如果我们将这些数据存储在User
集合中,则查询和管理变得非常容易。
简而言之:不要将nosql db视为关系数据库。它永远不会适合。为您的数据库建模,记住您未来的疑问。高度反规范化您的数据,使您的阅读更简单,即避免引用。