论坛首页 Java企业应用论坛

请做架构的朋友一起讨论下SNS中好友动态功能建模的设计

浏览 66486 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-03-27  

如果大家用过fackbook或者及国内的一些SNS对facebook拷贝的交友网站,就发现在在用户登录后首页有一个好友动态。它把好友最近发生的事情都罗列出来。
如用户个人首页对应有几种好友最近发生状态,blog,music,friend,video等等
实现方法个人考虑了几种(注意,前两种理论上可以实现,没具体去操作):
1),最简单那种,如果从不计较性能来考虑。实现这个功能就很简单。那就是对上面blog,music……等表都发起一条查询,再显示到页面。这种实现显示是不能让人接受的。
2),也笨拙,用sql union来实现,同样可以实现
3),这种实现就是针对好友动态创建一个表。即设计一个好友动态的对象。但怎么样来设计这个对象呢
如好友动态有如下属性:userId,friendUserId,createTime,余下的属性该如何来设计呢?是增加
blog,music,video等等通用名字的冗余字段(如name 对应blog标题,音乐名称,视频名称)又或者
又通过这个表去关联那些表呢
4),用JMS实现。发布订阅模式的应用。

想请问大家在面对这种功能需求的时候。会怎么来考虑?
贴张类似的需求的截图大家看看

 

 

  • 大小: 58 KB
   发表时间:2008-03-27  
需要通知的持久对象,可以对他的CRUD方法拦截吧,然后把相应的事件插入一个独立的通知表里面去。我是这么初步想的,不过还没有细想下去,等JavaEye将来做到这个部分的时候,我再仔细考虑。
0 请登录后投票
   发表时间:2008-03-27  
robbin 写道
需要通知的持久对象,可以对他的CRUD方法拦截吧,然后把相应的事件插入一个独立的通知表里面去。我是这么初步想的,不过还没有细想下去,等JavaEye将来做到这个部分的时候,我再仔细考虑。


除了JMS的选择之外.现在我也是这么考虑的.建立一张通知表,即好友动态的表.关键是如何设计这张表.相当于这张表要把好友往图片,视频,评论.音乐等等表插入记录的时候要合理的记录下来.
用户查询这张表就可以得出好友的最近所有动态信息包括图片,视频,评论...
0 请登录后投票
   发表时间:2008-03-28  
呵呵.大家关注的更多还是开发呀.做架构的朋友没兴趣讨论么?
我弄了一个Friend_Dynamic表.大家看看

Dynamic_ID varchar(32);//主键
user_id varchar(32);//用户编号
Dynamic_Name  varchar(400);//动态消息名称
Dynamic_Desc varchar(3000);//动态消息说明
Dynamic_Thumb varchar(120);//动态消息截图
Dynamic_Type int(1);//动态类型 blog/comment/music/video
Create_time Date;
0 请登录后投票
   发表时间:2008-03-28  
光这些还不够,怎么表示加了多个好友,多个照片,发布话题(跟其他不一样,还要显示段落)

其实只需要四个字段就够,获取数据时真正关心的是ID, 时间,显示需要关心的是数据和样式
user_id
operation_raw_data
operation_type
operation_time

根据operation_type从cache中获取operation_render_template
0 请登录后投票
   发表时间:2008-03-28  
我定义的应该类似uId,dataId, dataType, lastUpdateTime

分布式的再加上nodeId。

主要考虑比较时会涉及那些数据以及如何让这些数据尽可能最小,数据表索引最小,存储空间最小。但又要保证功能完整性。

通常这样的动作都牵扯比较大的数据量,所以要考虑系统的稳定性,效率相对而言就可以低点,因为这可以通过硬件来实现。





0 请登录后投票
   发表时间:2008-03-28  
imjl 写道
我定义的应该类似uId,dataId, dataType, lastUpdateTime

分布式的再加上nodeId。

主要考虑比较时会涉及那些数据以及如何让这些数据尽可能最小,数据表索引最小,存储空间最小。但又要保证功能完整性。

通常这样的动作都牵扯比较大的数据量,所以要考虑系统的稳定性,效率相对而言就可以低点,因为这可以通过硬件来实现。






dataId?这样设计性能应该是最差的,还没想到有比这性能更差的设计
nodeId?多此一举吧
0 请登录后投票
   发表时间:2008-03-29  
我觉得使用动态表是一种比较简洁,性能也比较好的实现方式
当然,动态表的实现也有几种方式
1. 实时的动态表(用户更新内容时,实时更新好友列表的数据)
2. 普通动态表(只新增,不删除)
msn space应该采用的是普通的动态表方式(至少表现方式上,因为遇到过点击进去看好友的内容,而数据已经被删除的状况)
0 请登录后投票
   发表时间:2008-03-29  
lllyq 写道
光这些还不够,怎么表示加了多个好友,多个照片,发布话题(跟其他不一样,还要显示段落)

其实只需要四个字段就够,获取数据时真正关心的是ID, 时间,显示需要关心的是数据和样式
user_id
operation_raw_data
operation_type
operation_time

根据operation_type从cache中获取operation_render_template

如果程序实现render还可以考虑加一个cache_content字段,或者可以直接使用js template+css,甚至parse raw to map部分也可以用js实现
0 请登录后投票
   发表时间:2008-03-29  
我网站用的是jms,相关操作的时候发一个消息到jms broker。

有些时候操作的时候不仅仅要记录这些事件,还可能需要其他事件。比如发邮件、发pm等等,这些是耗时的操作,也可配置到jms中。

不过现在感觉jms有点重,我想完全可以换成ruby的starling,这样用memcached的lib就能访问
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics