我使用MongoDB + PHP作为“facebookish”新闻源,提供不同类型的提要(帖子,照片,投票等)和评论。
每个Feed都属于某个“频道” - 目前可能是用户或组(将来可能会有更多容器)。
任何用户都可以订阅任何频道或取消订阅。
现在让我们说有大量的渠道和大量的饲料。频道/提要/评论的最佳结构是什么?
我正在考虑两种方法:
1)使用每个Feed中的订阅者列表收集Feed:
feeds:
[
{date_added: ...,
last_update: ...,
title: ...,
text: ...,
channel: ...,
channel_subscribers: [...],
comments_subscribers: [...],
comments: [...]
},
{...},
{...},
{...}
]
如果我想获得最后的Feed:
db.feeds.find({date_added: "this week", channel_subscribers: "my_login"});
如果我想获得带有新评论的Feed:
db.feeds.find({last_update: "this week", comments_subscribers: "my_login"});
优点:
缺点:
2)单独的“频道”集合: 同样的事情,但保留频道集合中的订阅者列表:
channels:
[
{channel_id:..., last_update: ..., subscribers: [...]},
{channel_id:..., last_update: ..., subscribers: [...]}
]
首先,我必须查询最近更新的频道:
subscribes = db.channels.find({last_update: "today", subscribers: "my_login"})
现在找到我的Feed:
db.feeds.find({channel: {$in: subscribes}], date_added: "today"})
优点:
缺点:
3)保持用户订阅用户集合(因此每个用户都有自己订阅的数组)
users:
[
{_id: ..., login: ..., email: ..., subscribes: [...]}
]
缺点: - 在这种情况下,我们将有更大的数组放入$ in而不是之前的(#2)方法。
4)您的建议?
答案 0 :(得分:1)
好的,我会自己回答。我试着在我的笔记本电脑Windows 7 32位/ 2GB RAM上进行测试。 我创建了一个“feed”集合,并用500个feed填充它:
feeds:
[
{_id: ..., subscribers: [...]},
{_id: ..., subscribers: [...]},
]
每个“subscriber”数组都有一个包含2000个短随机字符串名称的列表。
首先,我必须提到我的数据库大小从60Mb增加到1.5Gb。
然后当我运行shell命令db.feeds.ensureIndex({subscribers: 1})
时,它挂了大约3分钟然后因错误而停止:"can't map file memory - mongo requires 64 bit build for larger datasets"
。
因此,在mongo的文档中创建如此大的多键字段绝对不是一个好主意。