feed设计

对于sns来说,动态就是核心,动态是传播信息的媒体,用户以动态展开各种交互。

从技术角度来说,动态在读和写方面会很多,用户要先看到动态再去做其它操作,而其它操作都会导致动态的更新,表记录会很多,并只有插入,删除和查询,动态显示每个人都不一样,甚至有很大分别。

先说下好友表,好友表需要有用户id和好友的id两个字段,建唯一索引。连接的时候只需using index,如果内存够大,可以缓冲到内存中,速度够快~好友表肯定是sns中的大表之一,所以必须水平切分,好友表比较好分,因为没有查整张表的业务。

而个人动态,从业务来说,就是分为标题和内容。
例如:
[quote]
[用户a] 上传了 [n] 张照片至 [看图不说话]
[图片1] [图片2]

[用户b] 更新的头像
[新头像]

[用户c] 分享了 [用户h] 的日志 [你好,我也好]
[大家好,才是真的好]

[用户f] 与 [用户h] 成为好友

....
[/quote]
所以可以像设计论坛主题那样来设计这张表,但是为了性能,所以这张表要够小,对于动态字段都保存在持久存储系统中,例如Tokyo Tyrant,memcachedb

表结构:
[quote]feed_id mediumint(8)
user_id mediumint(8) 动态产生人
feed_type enum('blog', 'friend', 'album') 动态类型
input_date timestamp 发生动态时间,索引
feed_title 动态标题 放在持久存储系统中
feed_content 动态内容 放在持久存储系统中[/quote]
如果要考虑用户更改数据后更新动态,例如发表日志后,把标题改了,那可以把动态的数据和模板分离,那只需更新动态的数据就可以了,不过要产生动态的应用要记录动态的id

查询的话sql语句如下
SELECT * 
FROM `friend` f, `feed` fd
FORCE INDEX ( input_date )
WHERE f.friend_user_id = fd.user_id
AND f.user_id =1
ORDER BY fd.input_date
LIMIT 30

为了防止mysql自作聪明优化sql,所以强制用input_date索引,这样不会出现using filesort。。
可以考虑把最终结果放到memcached中缓存起来,无需考虑命中率,因为这里的cache只需起到分担数据库的压力就可以了,而memcahed自己有淘汰机制,非活跃用户的数据会被刷掉,前提是内存不够。

关于分表,可以把旧记录保存起来,极端点就删掉


[b]后期[/b]
这种方式对于初次来说还可以满足,后期的话,好友和feed的数量查询缓慢,所以,只能把feed推给用户,目前还在实验阶段。


参考资料:
uchome
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值