为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐4208626 2018-12-07 02:17:51
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..大概就是个递归的概念  
查看完整描述

5 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

在没有想到更好的办法前,还是直接写入数据库吧~使用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))

查看完整回答
反对 回复 2019-01-07
?
慕仙森

TA贡献1827条经验 获得超7个赞

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

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

 

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

查看完整回答
反对 回复 2019-01-07
?
慕慕森

TA贡献1856条经验 获得超17个赞

可能是我没说清楚..employeeID,ManagerID都在employee表中...其实是Sql2005自带的数据库AdventureWorks 中的HumanRecoures.Employee表
查看完整回答
反对 回复 2019-01-07
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

恩.很不错的思路...
查看完整回答
反对 回复 2019-01-07
  • 5 回答
  • 0 关注
  • 600 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信