如何创建好友动态

好友动态在各大社交网站中基本上已经是标配了,而且一般都会显示在用户登录之后的默认首页上,这种做法的确方便用户了解网站和自己朋友的一些动态。设计上应该如何实现呢?Google 了一些资料,整理在下面,欢迎有实际经验的朋友指点!

用户看到的可能是三种情况:

  • 我的动态
  • 好友的动态
  • 全站的动态

朋友动态这种信息,根据网站的实际情况需要考虑几个问题:

1、是否只让用户看到最新n条?(海内的最新动态数量是固定的,采用先进先出原则,用户只能看到最新的n条;而UCH则可以每页150条允许用户翻页 )

2、用户增减好友后,朋友动态是否能够立刻体现出变化?(在海内,我如果在好友名单中删除一个人,好友动态还会有他的信息,只是不新增他的信息而已;而UCH里面,他的信息立刻消失。加一个人为朋友,也是一样的效果。 )

3、用户能否删除自己产生的动态?

4、阅读者是否可以删除其朋友动态中某一条动态?(在校内用户可以删除某一条朋友动态,在UCH用户可以屏蔽某人或者所有人的某类动态,在海内你只能看不能屏蔽 )

5、动态是否有阅读权限?

6、动态所指向的信息被修改、删除,动态是否要同步变化?(如果你修改了日志的标题,校内网的动态是不变的,而海内是变化的)

最简单的实现方式是将所有事件记录到一张表里:
Event
- id
- user_id
- type
- data
- created_at
这样做比较适合用于显示全站更新,针对用户推送时,缺点明显:用户加好友后会显示出成为好友前的所有动态,删好友后之前的所有动态也看不到了。另外用户不能对活动进行删除,因为每个活动消息只有一份拷贝。
data 中可以用 json 来记录用户的动作,比如:
{
photoId
:
2089
,
 photoName
:
A trip to the beach
}


PS: QQ新版的消息中心,对于同一好友下不同类型的操作都能合并。这时候如果动态表包括有type的字段,就不太好对付了,可以改成:

data中保存用户的操作日志,也就是本贴讨论的重点。我采用的方法是前面有同学提到json方式。 如:

{
“blog”:[  {"id":1,"title":"安利台湾25周年庆"} ],
“photo”:[  {"id":1,"title":"51韶关游"} ]
}

其中blog、photo代表某种应用的标识,可以无限添加。只要显示的时候能分析就行。里面的id和title就是内容 的属性,结构自定。至于新旧操作怎么合并,我是采取对event表的插入操作进行拦截实现的——我定义会员所有的操作均调用event的插入方法。在拦截 函数中,先select该会员的记录。如返回为空,则直接插入新记录。如返回记录,则将待插入数据与原数据进行合并。如待插入数据为:

{
“blog”:[  {"id":2,"title":"我是谁"} ],

“share”:[  {"url":"http://www.tudou.com","title ":"土豆网 - 视频 - 播客 - 每个人都是生活的导演"} ]
}

则合并后的content为:

{
“blog”:[  {"id":2,"title":"我是谁"}  {"id":1,"title":"安利台湾25周年庆"}, ],

“photo”:[  {"id":1,"title":"51韶关游"} ],

“share”:[  {"url":"http://www.tudou.com","title ":"土豆网 - 视频 - 播客 - 每个人都是生活的导演"} ]
}

然后使用update方法即可。

为解决上面的问题,可以添加一个 EventUser 表,当用户发生动作后,用户的动作写在 Event 表中,给该用户的所有好友发一个消息,记录在 EventUser 表中
EventUser
- id
- event_id
- friend_user_id
- created_at
需要注意的是一定时间内完成的某些动作,对 Event 表应该更新,而不是插入。比如同时加N个好友可以合并到一个 event 中。另外当用户的动作被撤销后,也要考虑对应的 event 如何撤销。比如用户传了一张照片,然后又删掉了,这时如果传照片可以 event 没删掉,用户在动态列表中还会看到,XXX上传了一张照片,但点进去,照片已经不存在了。
优化:
Event 表可以做 mem cache
EventUser 表可以水平切分,分到多张表中,可以定期清除
写 EventUser 表的操作可以抛个消息,异步操作。或者先写到 mem cache 里,到一定条件时再持久化。
references:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值