java - 如何解决MongoDB中的 "Digg"问题

标签 java mongodb join nosql

不久前,一位 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/

相关文章:

mongodb - 对字段中的一部分字符串而不是 mongodb 中的整个字段进行分组

mysql - 加入前可以选择吗?

php - 棘手的 MySQL 查询涉及 NOT IN

java - Android - 实现 Parcelable 的更简单/更快/更简单的方法?

JavaFX:使用 MySQL 数据库中的数据填充组合框,StringConverter 破坏组合框

node.js - MongoDB没有更新

sql - 是否可以在 Access 的连接条件中使用子查询?

java - 连接池是否有利于多线程 Java 程序

java - 异步调用问题

node.js - 如何在发送响应后停止nodejs ajax请求代码