前段时间,一位Digg开发者发布了这个博客“http://about.digg.com/blog/looking-future-cassandra”,其中他描述了一个在MySQL中没有得到最佳解决的问题。这被认为是他们搬到卡桑德拉的原因之一。
我一直在玩MongoDB,我想了解如何
为此问题实现MongoDB集合
从文章中,MySQL中此信息的架构:
CREATE TABLE `Diggs` (
`id` INT(11),
`itemid` INT(11),
`userid` INT(11),
`digdate` DATETIME,
PRIMARY KEY (`id`),
KEY `user` (`userid`),
KEY `item` (`itemid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `Friends` (
`id` INT(10) AUTO_INCREMENT,
`userid` INT(10),
`username` VARCHAR(15),
`friendid` INT(10),
`friendname` VARCHAR(15),
`mutual` TINYINT(1),
`date_created` DATETIME,
PRIMARY KEY (`id`),
UNIQUE KEY `Friend_unique` (`userid`,`friendid`),
KEY `Friend_friend` (`friendid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这个问题在社交网络场景实现中无处不在。人们与很多人交往,他们反过来挖掘了很多东西。快速向用户展示他/她的朋友所做的事情是非常关键的。
据我所知,自那时以来,有几个博客提供了一个纯RDBM解决方案,其中包含针对此问题的索引。但我很好奇如何在MongoDB中解决这个问题。
答案 0 :(得分:1)
这样做的一种方法是在每个帖子中添加一个“朋友”数组。
{
date: Date(...)
friends: ['me', 'you', 'thatguy']
...
}
db.posts.ensureIndex({friends:1, date:-1})
然后你可以通过这样做轻松地显示我的页面:
db.posts.find({friends:'me'}).sort({date:-1})
只要每个用户的朋友少于约200,000,这将有效;您可能需要来自具有更多内容的用户的特殊情况帖子。一种方法是将朋友列表拆分为多个100,000块,并在每个块中输入一个
答案 1 :(得分:1)
mongo有许多可能的解决方案。您仍然可以将diggs存储在顶级表(a.k.a.集合)中,就像关系数据库一样,但另外可以将diggs存储为项集合或用户集合中的数组。类似地,友元关系可以在正向或反向方向上保存为用户集合中的数组。
最直接的方法可能是项目中的一系列diggs,以及用户中的一系列朋友。然后,一个简单的索引查询来检索用户的朋友,然后对索引的items.diggs.userid字段进行“in”查询。
Mongo自己的$in operator文档实际上使用了这个例子。