不久前,一位 Digg 开发人员发布了这个博客“http://about.digg.com/blog/looking-future-cassandra”,其中他描述了 MySQL 中未得到最佳解决的问题之一。这被认为是他们转向 Cassandra 的原因之一。
我一直在玩 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;
这个问题在社交场景实现中普遍存在。人们与很多人交 friend ,他们反过来又挖掘了很多东西。快速向用户展示他/她的 friend 在做什么非常重要。
据我所知,从那时起,一些博客就此问题提供了带有索引的纯 RDBMs 解决方案;但是我很好奇如何在 MongoDB 中解决这个问题。
最佳答案
一种方法是在每个帖子中添加一组“ friend ”。
{
date: Date(...)
friends: ['me', 'you', 'thatguy']
...
}
db.posts.ensureIndex({friends:1, date:-1})
然后你可以通过这样做轻松地显示我的页面:
db.posts.find({friends:'me'}).sort({date:-1})
只要每个用户的 friend 少于 200,000 个,这就可以工作;您可能需要特殊情况下来自用户的帖子不止于此。一种方法是将 friend 列表分成多个 100,000 个 block ,每个 block 创建一个帖子条目
关于java - 如何解决MongoDB中的 "Digg"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2823165/