用户操作,如社交网络 facebook、myspace,所有大的

Posted

技术标签:

【中文标题】用户操作,如社交网络 facebook、myspace,所有大的【英文标题】:User actions like social networks facebook,myspace, all big ones 【发布时间】:2009-07-22 18:12:06 【问题描述】:

我正在使用 php 开发一个社交网络类型的网站,我以前做过一次,但该网站超出了我的编码能力,无法跟上,这是几年前的事了,现在我想再次处理这个项目。

基本上在我的网络上有一个friend_friend mysql表,它跟踪谁是谁的朋友,对于每个确认的朋友,数据库中有2个条目 这是那张桌子:

    CREATE TABLE IF NOT EXISTS `friend_friend` (
  `autoid` int(11) NOT NULL AUTO_INCREMENT,
  `userid` int(10) DEFAULT NULL,
  `friendid` int(10) DEFAULT NULL,
  `status` enum('1','0','3') NOT NULL DEFAULT '0',
  `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `alert_message` enum('yes','no') NOT NULL DEFAULT 'yes',
  PRIMARY KEY (`autoid`),
  KEY `userid` (`userid`),
  KEY `friendid` (`friendid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1657259 ;

然后我有一个包含所有用户信息的用户表,名为friend_reg_user

然后是用户发布的公告表,其对象是仅显示与您成为朋友的用户的公告。 这是公告表

CREATE TABLE IF NOT EXISTS `friend_bulletin` (

  `auto_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(10) NOT NULL DEFAULT '0',
  `bulletin` text NOT NULL,
  `subject` varchar(255) NOT NULL DEFAULT '',
  `color` varchar(6) NOT NULL DEFAULT '000000',
  `submit_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `status` enum('Active','In Active') NOT NULL DEFAULT 'Active',
  `spam` enum('0','1') NOT NULL DEFAULT '1',
  PRIMARY KEY (`auto_id`),
  KEY `user_id` (`user_id`),
  KEY `submit_date` (`submit_date`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=455144 ;

好的,为此我会在friend_friend表上运行查询以获取用户的所有朋友并将它们添加到像这样的字符串 1,2,3,4,5,6 这些将是朋友 ID 号然后从公告表中选择公告作者 ID 在我的朋友 ID 列表中

第二种方法是使用 JOINS 一次获取所有这些数据。

我的任务终于来了,一旦网站变得非常大,当数据库中有数百万的朋友记录和公告时,这一切都会变慢,我有什么办法可以加快速度?有一个更好的方法吗?此外,我计划更改公告以包含更多内容,而不仅仅是公告,而是像现在的大型网站一样执行更多用户操作,以便显示状态更新、博客和公告等所有内容

【问题讨论】:

【参考方案1】:

您希望通过多种方式完成您想要做的事情。您可以有一个汇总汇总表,它结合了给定成员的所有关联数据(在本例中为朋友)。

这是一种非常基本的方法,但它可以变得更加复杂。

汇总汇总充当持久缓存机制。您必须通过某种方法保持最新​​状态 - cron 作业、MapReduce 等。您不想在每次需要时计算所有数据 - 相反,定期计算它以便快速准备好。

Memcache 是一个很棒的缓存工具,但它缓存的数据无论如何都必须在某个时候进行计算。不幸的是,Memcache 不是持久的。这意味着如果 memcached servier 或服务死了,你的数据也会死。

您可以探索一些先进的尖端技术,例如 MongoDB、CouchDB、Project Voldemort 和 neo4j,以获得一些更高效的工具。

我还建议在http://www.elgg.org/查看基于 PHP 的开源社交网络 Elgg 的源代码

【讨论】:

【参考方案2】:

Facebook 使用 memcached 将 SQL 数据库存储为分布式哈希表。这可能是你最好的选择。

【讨论】:

我有一个朋友也拥有一个大型网络,他提到使用某种哈希表进行快速查找,但他对他的代码和方法非常保密,我只知道他的东西很好用他也提到了哈希,但我找不到太多关于如何做这样的事情的信息

以上是关于用户操作,如社交网络 facebook、myspace,所有大的的主要内容,如果未能解决你的问题,请参考以下文章

关于 Facebook 等社交网络的数据库模式

如何在社交网络中实现活动流

在新的社交网络中开放社交[关闭]

有限的个人资料,如 Facebook

从多个社交网络(Facebook 和 Linkedin...)获取统一配置文件的数据库方案

Facebook 的直播社交插件是不是允许标签过滤?