- 程序有所改变。发帖如还有问题请报告
- 【征集】西西河的经济学,及清流措施,需要主动参与者,『稷下学宫』新认证方式,24年网站打算和努力目标
主题:存储西河发帖、跟帖的方式 -- 华夏英雄
最近想建一个个人网站,有类似西河这样的发贴、跟贴功能,也有博客那样的功能。想请教一下,通常情况下如何存储这些帖子呢?是否只能用数据库?多谢!
也可以比如直接用file system。但是数据库查询起来比较方便,象index,lock之类的都已经搞好了,何乐而不为。
要储存象西西河论坛这样树状论坛的数据,其实就要多一个数据:父帖id,也就是被回复帖子的id。这样显示某个主题时,只要将此主题所有帖子查出,然后根据每个帖子的父帖id,就可以很容易重构整个主题的回帖树了。
我也认为可以通过加一个父帖id来管理。但是,如何从一个父帖找到一个子帖呢?子帖们又如何排序呢?
以前学“二叉tree”的数据结构时,可以通过“左儿子”和“右儿子”来排序,但现在是多个儿子的情况似乎不太可能。
另外一个问题,如果数据很多的情况,数据库和file system,那个的效率更高,更容易实现呢?
跟帖的时间一定晚于父帖,所以当你从数据库中查询某主题的所有帖子时,令结果以时间早晚排列。然后从头到尾扫描所有结果,如果发现某帖有父帖,就将其插入父帖后。在以时间排列的情况下,父帖一定先于子帖被扫描,所以不存在扫描到子帖时还没扫描到父帖的情况,整个过程只要扫描一遍即可,扫描时可以顺便算出需要缩进的层次,每个子帖的缩进层次是父帖的层次加1。
至于“数据很多的情况”,一般无需考虑,普通论坛再怎么多,也不会多到哪里去,最多把附件从数据库分离开来,直接存在file system里。
把帖子内容保存在文件系统中,把帖子内容文件路径保存到数据库中。
另外,你需要考虑一下,是否提供帖子内容的搜索。单纯的数据库全文搜索效率很低,比较好的方法是使用luence之类的搜索引擎。
如果,另外如果考虑到论坛的水平扩展,那么还需要考虑文件系统被多个web服务器共享,,,,
但第一次听说luence。如果我使用第三方的hosting server和java servlet等技术,不知道还能否luence。刚看了一下luence,感觉是java based的,应该可以在第三方的hosting server (Linux + Java)中使用。不知道感觉是否正确。
你说到“需要考虑文件系统被多个web服务器共享”,我觉得这本质上是个权限的设定问题。不知道你是否也是这个意思,还是说有一些文件格式不能被某些web服务器识别,或者不能够被某些browsers支持?
烦指教!
你所说的file system具体是什么呢?是否就是windows 或者linux这些文件系统?
另外,我看到有些回帖内容中可以加上“笑脸”等icon,也可以添加附件。我觉得附件可以放在文件系统中,但那些icon怎么处理啊?难道把.img/.jpeg文件放在文件系统中,再把它们的文件名链接到帖子的内容中?
对于笑脸等的处理,一般也是按照你所说的处理,有时以比如[:em63]这样的字符串代替,表示比如第63个表情符号,在产生html时把这样的字符串代换为<img src=....>。
论坛程序还是有一些复杂的,象我这样说是没办法说清楚的,里面有些你也许一时想不到的关键地方,比如说如何防止SQL injection黑客手段等等的东西。你最好去具体读某个比较成熟的论坛程序的源码,这样就能体会到各个细节部分。其实一般谁自己要架一个论坛也不会自己去写,都是找个成熟的论坛程序直接用了,西西河是很特别的。
luence是个java开源项目,可以内嵌到其他java应用中使用。
至于"文件系统被多个web服务器共享",不是权限问题。举个例子,你有两台web服务器,用户的http访问在两台web服务器间分担。系统中有个用户上传头像的功能,某个用户上传头像的时候,访问web1,头像文件就保存在web1的某个目录中;这样,如果下次用户访问被分配到了web2机器上,因为这个头像文件在web1上,那么web2访问不到这个用户的头像,就出问题了。
解决这种问题的最简单的方法是使用mount在不同web机器上共享目录。
另外作论坛,不建议用java,php有个很成熟的论坛框架discuz,你可以考虑一下。http://www.comsenz.com/products/discuz
非常遗憾的是,目前流行的论坛程序绝大部分是PHP的,比如vBulletin(这个不是开源的,但是源码到处都下载得到),PHPWind,Discuz!等等。即便你还是希望自己写一个Java的,也应该看看别人写的至少一个程序,最好是流行的,有许多人在用的,这样才能知道会遇到什么实际问题,该怎么样解决。
- -- 系统屏蔽 --。