首页 新闻 会员 周边

大牛请进..问个关于 网易 评论 的问题 200分奉上

0
悬赏园豆:200 [已解决问题] 解决于 2010-02-06 11:14

http://comment.news.163.com/news_guonei4_bbs/5U5VVMOP0001124J.html

这个是网易的评论..

我现在想问的是大牛们是如何处理...如何设计数据库..

一种是直接将引用的数据直接存进数据库....这种优点是方便处理..性能也高.就是评论内容字段会有点大.

另一种是在数据库中新建一个字段 Parentid 来显示...当parentid=null 的时候是没用引用任何内容..

当parentid !=null的时候.查找上一级ID..然后一直递归..直接ParentID=null..

 

如果是你们设计的话..你们会如何设计 ...

 

 

顺便再放上一个问题...请问一下

SQL 2005 "with as " 如何操作......自己找了一些资料.不太明白..

我现在有字段   employeeID, ManagerID.   ManagerID是employeeID的外键

我如何用 with as 语句得到  employeeID=1的所有上级.直到ManagerID=null..大概就是个递归的概念

 

1酷的主页 1酷 | 初学一级 | 园豆:0
提问于:2010-01-29 11:29
< >
分享
最佳答案
0

在没有想到更好的办法前,还是直接写入数据库吧~使用Parentid没有索引就会查的很慢了,建立索引的话也是硬盘开销。牺牲硬盘的成本比牺牲速度的成本要便宜。

另外,如果用Parentid,那么引用的帖子如果修改或者删除了怎么办?引用者说的话就无法知道其原意了。

—————

想了想,如果不用第一种方法。想到一个效率更高些的方法:

每个非引用贴的ID为整数x10000(假设最多9999个回复的情况下),如12345 0000

引用帖的ID为原帖ID+1 即 12345 0001 ,12345 0002 等等

这样,假如要得到ID为2220010的帖的所有引用时,只需要where id>=2220000 and id<= 2220010 就可以了。应该比递归快很多(ID为聚集索引)

 

(这样取出的顺序就和原来不一样了,不过可以 order by postTime,还可以加一些逻辑,保证对多个post引用一个post的时候只按最大的ID取一次)

 

(另外,假如有这么一种情况,一个论坛有很多分区,每个分区又可以有子分区,子分区还可以“无限”有子分区。 在这种情况下,也尽量不要用parentId即递归,而是考虑使用位域(flags))

收获园豆:100
vons | 小虾三级 |园豆:1033 | 2010-01-29 12:18
其实只引用一个人的发言就够了,而无视引用的人引用了什么。网易的这个..看着很乱..
vons | 园豆:1033 (小虾三级) | 2010-01-29 12:28
@vons:恩. 我这里也是纯讨论一下..具体做我也觉得是直接写数据库比较容易..另你说的删除ID我确实没想到...总之ParentID的方式做需要考虑的东西太多了.
1酷 | 园豆:0 (初学一级) | 2010-01-29 13:11
@1酷: 假如一个页面10个帖子,每个帖子都引用上面的帖子。那么这个页面就要至少使用递归查找9次,想想太浪费了。这些查询所造成的性能损失,花多少钱买多好的CPU或者高转速的硬盘能弥补回来呢?相反,采用第一种方法,空间不够了,只用相对便宜的在磁盘列阵中再加一块就好了。
vons | 园豆:1033 (小虾三级) | 2010-01-29 13:38
恩.我现在也是纯讨论一下..或许有人有更好的数据库设计方式...
1酷 | 园豆:0 (初学一级) | 2010-01-29 14:40
恩,肯定有更好些的设计方法。我个人还是倾向第一种哈,最简便和最快的。听听别人的意见。
vons | 园豆:1033 (小虾三级) | 2010-01-29 15:11
个人感觉是第一种方式,时间和空间通常都是对立统一的
查尔斯 | 园豆:3832 (老鸟四级) | 2010-01-30 01:24
其他回答(2)
0

我想评论内容按照大小分为存储在数据库中和存储在文件中,大评论数据库中只存标志,标志指向内容所在的文件,在显示时异步加载数据库和文件中的评论。

递归这东西应该用到,不然怎么遍历评论的评论呢?

 

with as 就是个结果集别名,

with test as (select * from test)

select * from test where a=1;

你那个应该写成

employeeID 所在表为employee,ManagerID所在表为Manager

select * from employee as e,ManagerID as m where e.employeeID=1 and ManagerID<>null

收获园豆:50
Aicken(李鸣) | 园豆:480 (菜鸟二级) | 2010-01-29 13:11
可能是我没说清楚..employeeID,ManagerID都在employee表中...其实是Sql2005自带的数据库AdventureWorks 中的HumanRecoures.Employee表
支持(0) 反对(0) 1酷 | 园豆:0 (初学一级) | 2010-01-29 13:36
0

我想:那些评论是不会即时存到SQL的, 先存在一个他们制定的模板上, 这个模板可能像XML。

最后才用另外一个服务器专门来访问这个评论文件服务器,把数据存到SQL。

收获园豆:50
风浪 | 园豆:2996 (老鸟四级) | 2010-01-29 16:46
恩.很不错的思路...
支持(0) 反对(0) 1酷 | 园豆:0 (初学一级) | 2010-01-29 17:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册