论坛首页 Java企业应用论坛

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

浏览 66751 次
该帖已经被评为良好帖
作者 正文
   发表时间:2008-10-20  
我是这样做的  
1.配置 action字典表   告诉系统那些action需要生成动态
2.与action字典对应有一张action的详细配置表,比如,合并动态,类型等一些数据,配置中关键是占位符%s 
比如:<a class='name yellow' href='#{ctx}/mag.do?uid=%s'>%s</a> 发表日志  %s  <a href='#{ctx}/Journal/view.do?id=%s&uid=%s'><br/>继续阅读</a> 

有些东西需要翻译下  呵呵
3.在crud中添加 xxxManager.add(new String args[]{"",""});
4.在add方法中拿到action空间名和action名 找到对应的字典与配置

当然在上面的方法中,还要找一个合适的位置注入用户,ip,名字空间和action名称。。。这些数据  就可以了
0 请登录后投票
   发表时间:2008-10-20  
当然像其它的社区  可能会更加方便添加动态    期待大家讨论
0 请登录后投票
   发表时间:2008-10-20  
不要想的太复杂了,不要追求先进的技术。
0 请登录后投票
   发表时间:2008-10-21  
我认为这个架构设计,应该从每个用户考虑。首先我们应该定义一个需要记录用户操作的描述,比如当用户添加一个好友时,或者浏览过某篇日志时等等这些,这些操作事先应该声明,让系统知道这些操作将要被记录。
记录的方式有很多重,比如JMS各位大哥们都提到的,还有比较传统的数据记录等等。
这里还要考虑的是记录的时间段,应该要设置一个属性来标志这些操作是哪个时间段的,一般设置为1周吧。
每个用户需记录的动作都得记录下来,而当某个用户登陆时,假设用户登录时会触发调用好友的动态,这时系统会搜索此用户的所有好友的操作记录,并以某种形式包装起来。并传到前段显示。
这里面比较难做到的是如何获取用户的所有好友操作记录。因为要考虑效率问题。
这只是我的初步设想好,请各位多多指点
0 请登录后投票
   发表时间:2008-10-25  
SNS网站大多数都是php做,我觉是如果是系统自动记录好友动态的信息,那么如何控制这些动态信息在个人主页显示不显示呢!再说系统如何知道这些操作系统会记录呢!这些问题?
请大家多多指点一下!
0 请登录后投票
   发表时间:2008-10-25  
除了类似QQ的这样的用户数量, 以上各位的想法都是可行的。

    我也在考虑这样的复杂性的应用, 我可能会采用search engine通常采用的机制来完成, 或者使用分布式数据库来用map/reduce完成消息的分发机制。 当然, 这些办法实现都是公司有比较多的技术积累工作。 小公司是非常难以实现的。 不过, PGSQL目前有个项目是基于m/p的项目, 实现了基于PGSQL的分布式应用。 可以实现大规模群集的操作。  希望大家能都去了解下。 
   目前大规模系统的open source也是越来越多了。 大家在思考问题的时候, 不要拘泥在单一的dbms/jms/log等等技术上。 当然如果是小规模的项目, 每天的PV 在1000W以下的系统, 我觉得无论怎么做SNS都是非常简单的工作。
  对于大规模分布式计算/存储的应用有兴趣的可以和吹牛啊, 目前, 我也非常有兴趣。
0 请登录后投票
   发表时间:2008-11-05  
看到大家一直在讨论这个问题其实还好了。我们只要记住一点就好。每个人操作总是慢速的,每个人朋友数量也总是有限。所以这样的需求最好设计方法就是,每个人有操作的时候记录他的操作,同时给他的朋友信息表里插一条信息copy,这样每个人想要了解自己的朋友作什么事情,只要去读取信息COPY表里的数据就可以了。
0 请登录后投票
   发表时间:2009-01-03  
dank 写道
看到大家一直在讨论这个问题其实还好了。我们只要记住一点就好。每个人操作总是慢速的,每个人朋友数量也总是有限。所以这样的需求最好设计方法就是,每个人有操作的时候记录他的操作,同时给他的朋友信息表里插一条信息copy,这样每个人想要了解自己的朋友作什么事情,只要去读取信息COPY表里的数据就可以了。

这样数据冗余就太多了,而且好友如果很多的话,要同时插入很多记录

前面的用用户独立的js来存储记录的方式我也考虑了一下 磁盘io会有负担.....
0 请登录后投票
   发表时间:2009-01-03  
eason007 写道

最近也在做这个东西,刚才看了大家的讨论,终于想通了该怎么做了。现在给大家说说。

建一日志表,记录所有用户的操作日志,结构如下:

 

event(事件)

字段名称

类型

默认值

描述

ID

Int(10)

 

自增长,主键

userID

bigInt(20)

Not null

用户ID.索引

userName

Varchar(20)

Not null

用户姓名

content

text

Not null

内容

createTime

int(10)

Not null

创建时间.索引

content中保存用户的操作日志,也就是本贴讨论的重点。我采用的方法是前面有同学提到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方法即可。

 

 

 

但这里有一个问题就是,如果用户每天或每个数据表清理间隔中(如我的系统定义为2天)都有操作产生,则会累积很巨大的历史记录,我初步考虑是在拦截方法中进行过滤。而如果用户在2天内没有新的操作产生,则会被我另外定义的数据清理任务删除记录。

假如现在有个需求,用户可以自行删除好友的动态,比如他已经看到好友动态某人写blog了,不想再知道这条消息了怎么处理

0 请登录后投票
   发表时间:2009-01-17  
rainytooo 写道
eason007 写道

最近也在做这个东西,刚才看了大家的讨论,终于想通了该怎么做了。现在给大家说说。

建一日志表,记录所有用户的操作日志,结构如下:

 

event(事件)

字段名称

类型

默认值

描述

ID

Int(10)

 

自增长,主键

userID

bigInt(20)

Not null

用户ID.索引

userName

Varchar(20)

Not null

用户姓名

content

text

Not null

内容

createTime

int(10)

Not null

创建时间.索引

content中保存用户的操作日志,也就是本贴讨论的重点。我采用的方法是前面有同学提到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方法即可。

 

 

 

但这里有一个问题就是,如果用户每天或每个数据表清理间隔中(如我的系统定义为2天)都有操作产生,则会累积很巨大的历史记录,我初步考虑是在拦截方法中进行过滤。而如果用户在2天内没有新的操作产生,则会被我另外定义的数据清理任务删除记录。

假如现在有个需求,用户可以自行删除好友的动态,比如他已经看到好友动态某人写blog了,不想再知道这条消息了怎么处理


回楼上。要做也可行,即然都用了json。那就把你的好友都放进来。要删除的去掉就OK了
0 请登录后投票
论坛首页 Java企业应用版

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