MYSQL替代方案

时间:2014-01-21 17:30:18

标签: mysql

我正在编写一个社交网络类型的网站,用户有朋友,我正在尝试使用他们的朋友已完成的操作创建新闻Feed

我有三张桌子

用户

id     |    username
---------------------
1      |    john
2      |    nicole
3      |    bob

id     |    uid    |    who
----------------------------
1      |     1     |     2
2      |     2     |     1
3      |     2     |     3
4      |     3     |     2
5      |     3     |     1
6      |     1     |     3

操作

id    |    owner    |  to_id  |    message 
-------------------------------------------
1     |     3       |    2    |     'hello'
2     |     3       |    1    |     'yoooo'

由于'john'是'bob'的朋友,'john'应该可以看到'bob'动作'nicole'

编辑::如果'妮可'向'鲍勃'发送动作,我也希望从另一个方向获取行动

我目前的解决方案是:

有一个字符串,其中包含用户的所有朋友:$ friends ='1,2,3,4 .... etc'

查询:

SELECT 
   `Actions`.*
FROM 
   `Actions` 
WHERE 
   (`Actions`.`to_id` IN (${friends}) OR  `Actions`.`from_id` IN (${friends})) 
   AND
   ( `Actions`.`to_id` != (${logged_id} AND `Actions`.`from_id` != (${logged_id})
ORDER BY
    `Actions`.`time` ASC
LIMIT 
    15

上面的查询有效,但我的问题是,当用户开始有数百名朋友时,这个查询会非常慢,我可以做些什么来防止这种情况?

2 个答案:

答案 0 :(得分:1)

如果您想尝试其他更好的解决方案,请尝试使用任何流行的图形数据库。它非常适合您当前的要求。

答案 1 :(得分:1)

使用JOIN实现这个目标怎么样?

SELECT actions.* 
FROM actions a 
JOIN friends f ON f.who = a.owner 
WHERE f.uid = (current user's ID)
LIMIT 15

(返回当前用户的朋友拥有的15个动作。)