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..大概就是个递归的概念
在没有想到更好的办法前,还是直接写入数据库吧~使用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))
我想评论内容按照大小分为存储在数据库中和存储在文件中,大评论数据库中只存标志,标志指向内容所在的文件,在显示时异步加载数据库和文件中的评论。
递归这东西应该用到,不然怎么遍历评论的评论呢?
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
我想:那些评论是不会即时存到SQL的, 先存在一个他们制定的模板上, 这个模板可能像XML。
最后才用另外一个服务器专门来访问这个评论文件服务器,把数据存到SQL。