2009-07-23 74 views
0

我有一个类似于myspace的社交网络,但我使用PHP和MySQL,我一直在寻找最好的方式来显示用户公告,只有 fronm自己和从用户与他们确认的朋友。获取社交网络的朋友动作的最佳方式php/mysql

这涉及到3个表

friend_friend =对于谁是谁的朋友 friend_bulletins =此存储公告 friend_reg_user =这是主要的用户表中包含的名字和照片的URL的所有用户数据该表存储记录

我会发布公告和朋友表图下面,我将只张贴用户表的重要领域。

- 对表表结构friend_bulletin

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=245144 ; 

- 用于表friend_friend

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=2657259 ; 

将用于 auto_id friend_reg_user表字段表结构=这是用户ID号码 disp_name =这是用户名 pic_url =这是一个缩略图图像路径

  • 公告应显示张贴由是我们的朋友列表中的用户ID的所有公告
  • 还应该表明我们发布我们自己
  • 需要很好地扩展的所有公告,朋友表是几百万行

// 1老方法使用子查询

SELECT auto_id, user_id, bulletin, subject, color, fb.submit_date, spam 
FROM friend_bulletin AS fb 
WHERE (user_id IN (SELECT userid FROM friend_friend WHERE friendid = $MY_ID AND status =1) OR user_id = $MY_ID) 
ORDER BY auto_id 

//我上过的朋友少量的,因为这Ø账户使用的另一种老办法NE使用另一个查询 ,将返回所有的朋友有一个字符串,以这种格式$ str_friend_ids =“1,2,3,4,5,6,7,8”

select auto_id,subject,submit_date,user_id,color,spam 
from friend_bulletin 
where user_id=$MY_ID or user_id in ($str_friend_ids) 
order by auto_id DESC 

我知道这些都不是好因为我的网站变得越来越大,所以我一直在尝试使用JOINS

我相信这会得到我需要的一切,除了它需要修改以获取由我自己发布的公告,当我将其添加到WHERE部分时似乎打破它,并张贴每个公告返回多个结果,我想是因为它试图 返回的结果,我的friedn,然后我试着认为自己的朋友,这并不好工作。

我这整个帖子的重点虽然是我打开的最佳性能的方式做这个任务的意见,许多大的社交网络有回报的,只有你的朋友张贴的项目列表类似的功能。还有其他更快的方法吗?我一直在读取连接并不伟大的表现,但我还能怎么办呢?请记住我不使用索引,并有一个专门的数据库服务器,但我的用户群很大有围绕

SELECT fb.auto_id, fb.user_id, fb.bulletin, fb.subject, fb.color, fb.submit_date, fru.disp_name, fru.pic_url 
FROM friend_bulletin AS fb 
LEFT JOIN friend_friend AS ff ON fb.user_id = ff.userid 
LEFT JOIN friend_reg_user AS fru ON fb.user_id = fru.auto_id 
WHERE (
ff.friendid =1 
AND ff.status =1 
) 
LIMIT 0 , 30 

回答

1

首先是没有办法,你可以试着划分出来的数据库,以便你只访问一个包含所需主要行的表。将不常用的行移到另一个表中。

JOIN可以影响性能,但从我所见,子查询并不是更好。尝试重构您的查询,以免一次性提取所有数据。它似乎也可以在您的应用中的其他地方运行一次该查询,并且这些结果可以存储在变量中或缓存。

例如,您可以缓存为每个用户连接的朋友阵列,只是在运行查询时引用它,并且只在添加/删除新朋友时更新缓存。

它也取决于你的系统和你的代码架构的结构 - 你的瓶子可能不完全在数据库中。 “

+0

”您可以缓存为每个用户连接的朋友阵列,只是在运行查询时引用该参数,并且只在添加/删除新朋友时更新缓存。“ 我实际上一直在寻找这样做的实用方法我打开任何建议,如您所提及的1问题,我可以更新此缓存,当我添加一个朋友,但是当另一个用户添加我会更难做但这可以解决我确信。至于缓存一系列的朋友,我不知道我该如何做到这一点,有些用户拥有多达50,000个朋友 – JasonDavis 2009-07-23 06:47:47