我正在构建一个用户拥有活动Feed的社交应用。如果用户属于同一组,则Feed中的项目将相同。
所以...应用程序有许多用户可以选择的组。如果发生事件,将为该组中的每个用户创建活动源项。
但是我现在想到了一个包含userIds数组的单个文档的想法,没有可以针对活动供稿项采取的操作,所以我们没有什么可担心的。
我的问题实际上是两种方法中哪一种最好还是有更好的选择?预计一个小组可以容纳超过1万的用户。
答案 0 :(得分:2)
检查我的理解:
所以,你的收藏品是:
每个事件的FK均为groupId
。每个用户都有一个groupId
s。
您创建用户活动供稿的查询将是:
Events.find({groupId: {$in: user.groups}});
groupId上的索引,当需要缩放时,您可以保存默认活动Feed&将其发送给没有组(或具有默认组)的每个人。 IIRC这就是reddit所做的。
尽量避免在1:M关系中使用数组。
答案 1 :(得分:0)
您没有提及的一个选项是创建类似Memberships
集合的内容,其中文档的格式为{userId, groupId}
,并在两个字段上创建唯一的复合索引,如< / p>
Memberships._ensureIndex({groupId: 1, userId: 1}, {sparse: true, unique: true})
以这种方式创建索引可能是有意义的,因为您将查找特定组中的用户,并将帖子加入该组ID。如果您要按用户查找群组,则可以先将userId
编入索引。
如果您要为每个用户同时显示多个组的联合活动,则可能会遇到Same-Origin Policy问题,在这种情况下,更新可能会更简单如果组发生更改,则直到用户刷新页面为止。
答案 2 :(得分:0)
我建议您创建自己的publish
方法,以便只订阅相关数据,不要将过多数据部署到本地mongo。您可以在此处找到Flow-Router和基于路由的订阅的示例:
http://meteorpad.com/pad/Ba5DTe94NjFi3ZTPA/Playground_Flow-Router_Chat
答案 3 :(得分:0)
我想说最有效的选项是每个活动供稿都要嵌入每个用户文档中:
{
"firstname" : "Joe",
"lastname" : "Bloggs",
"activities": [{
"title": "Someone did something"
}, {
"title": "Someone did something else"
}]
}
以Facebook为例,我认为活动源上的项目很少会改变。但他们会读得很多。每次加载活动源时,执行昂贵的连接查询(在非关系型NoSQL产品上)都会降低性能。
您最好将其嵌入User
本身,就像手中拥有当前用户一样,您也可以随身携带活动源。
当活动被提升时&amp;需要添加到10K用户,那肯定会花更长的时间。但这可能发生在后台和只要需要就行。用户一旦发现朋友活动,就不会发生这种情况。
这种方法也存在缺点。例如,您需要将这些活动数据减少,或者您可能会为单个用户获取大量数据。然后丢掉一大堆。