注册 登录
编程论坛 J2EE论坛

[讨论]JSP论坛中帖子的顺序

飘飘叶子 发布于 2006-09-08 08:43, 1361 次点击
一个论坛嘛,大家都知道的,新开的主题肯定是位于置顶帖下面,也就是非置顶帖的第一条,回帖后那个主题也会变成第一条。如果是在排序的时候,应该以什么作为基础来对帖子进行排序呢?
我自己想了一个解决方案,但觉得不是最好,特发帖来讨论
我的解决方案如下:
在数据库中新增一个字段,比如叫state,当发帖后,取得当前数据库中state值中最大的值,然后+1存给新的帖子,如果有回帖,则取得回帖的主题的state值,再取得当前最大的state值,比较后如果2个值相等则不改变,否则把最大的state值+1后更新给新回帖的主题,这样只要按照state进行排序就能对主题进行排序了。
例子:
有主题1,2,3。对应的state值也为1,2,3。如果新开一个主题4,则取得当前最大的state值3,对其+1后存给主题4。这时有一个对1帖子进行回帖的操作,于是取得当前最大值与该主题的state值相比,当前值比主题的大,+1后更新给帖子1,这时帖子1,2,3,4对应的state值为5,2,3,4。对state进行排序后,顺序为1,4,3,2。
不知道各位有没有其他更好的办法来实现?
12 回复
#2
无理取闹2006-09-08 10:17
用时间楼主觉得怎么样?
时间最晚的那个放在第一位

#3
飘飘叶子2006-09-08 10:51
我当然也考虑过用时间啦,但这样一来就有2个步骤需要做
第一,取得主题的所有时间并排序(因为要考虑主题还没有回帖的情况),取得回帖中最晚发表的帖子的时间
第二,将2个时间进行比对,最后得出顺序

综合下来,我还是放弃了这个方案……
#4
无理取闹2006-09-08 10:58
去问问静老大怎么实现的 呵呵
#5
飘飘叶子2006-09-08 11:00
我想……静老大的这个论坛也不会是自己写的吧。。。太浩大了点……
#6
无理取闹2006-09-08 11:06
应该知道原理吧
#7
神vLinux飘飘2006-09-08 12:00
我当然也考虑过用时间啦,但这样一来就有2个步骤需要做
第一,取得主题的所有时间并排序(因为要考虑主题还没有回帖的情况),取得回帖中最晚发表的帖子的时间
第二,将2个时间进行比对,最后得出顺序

综合下来,我还是放弃了这个方案……
-------------------------------------------------------------------------------------
用 更新时间 是个比较好的方案
但是我不明白你的两个步骤是怎么得出来的

用SQL语句也只用一句而已,如果你在描述数据库是怎么实现的,也未免太.....
主题中要求有个字段是用来指向最后的回复的,如果是新主题,那么发表时间和更新时间相同,而且指向最后回复的字段为空
如果是旧主题,则发表时间比更新时间要早,而且更新时间等于最后回复的时间

很多论坛采用的是很奇怪的处理方法,个人觉得都不大好,比如说二叉树等
#8
神vLinux飘飘2006-09-08 12:05
简单描述一下:

T_THEME
----------
ID char(32) not null unique, 主题编号
PT timestamp not null, 发表时间戳-PostTimestamp
UT timestamp not null, 更新时间戳-UpdateTimestamp

然后主题按照UT进行排序,当然,如果有什么置顶呀,救生圈之类的,这样是不能实现的


#9
飘飘叶子2006-09-08 12:36
发现UT就等于我的那个state……只是我用的是数字表示,而UT是用时间表示
#10
神vLinux飘飘2006-09-08 13:02
你的state是冗余字段,想想,你怎么表示这个帖子什么时候被更新的呢?
#11
神vLinux飘飘2006-09-08 13:06
也许你会说去回复表中找该主题的最后回复,可以是可以,不过我每次刷新你都要去到浩瀚如海的回复表中查,不怕影响性能么?
而且如果最后回复是被管理员删除了的,那么这个最后回复就会变成上次回复了--不过不知道这样是不是更加合理,呵呵
#12
飘飘叶子2006-09-08 13:07
有道理啊……哈哈,那么就是在有回帖的时候把时间更新一下,然后比较一下发帖时间和更新时间咯?
这个办法好~
#13
神vLinux飘飘2006-09-08 13:13
恩,是的,但是要处理好数据库的事务就行了
1