“评论盖楼”的设计思路

1、

这样的需求其实挺特殊,每个“楼”都是一个独立的“树”,每个“楼”都“几乎”不用依赖其他的“楼”。
最简单、最高效的方式是用文件来存储每一个楼,每个新闻一个楼,使用xml、json等树形结构的文件格式来规范评论和新闻内容。这样每进一个楼只需要访问一个文件,发评论只是创建一个文件,把楼盖高,只是给增加新内容。而新闻列表可以存储在数据库中,也可以用lucene做索引。

如果一定要用数据库实现,那么新闻(主贴)做一张表,评论(回贴)做一张表,评论表中添加新闻id字段作为与新闻表的外键关联即可。如果要进一步完善树形结构,评论表上补充一个指回评论表的外键即可。

 

如果性能非常重要,这个方式是很有意义的,而且新闻列表一定是用lucene做索引。
新闻首页一定不是直接查询数据库,而是静态化该页面。在后台做一个轮训器,定期更新这个静态页,如果有重大新闻发生,强制更新该页面。
新闻内容、评价页静态化或者单文件处理,能极大降低服务器压力,毕竟没有数据库操作。每天一个目录,或者每小时一个目录,在文件存储方面就不会对文件系统形成较大压力。

 

2、
于数据压力,用数据库的话,可以分拆为每年、每个月再或者每周一个新闻库,只需要每次新增一个库即可。具体的处理方式就要看你用的数据库。
某些情况下,将当月、重点的新闻单独提炼出来静态页面项目,需要对当月、重点的新闻做大规模的负载均衡,对其他不重要新闻则使用普通的方式。

新闻内容如果静态化
优势:可以使用apache甚至lighttpd、nginx服务器,对应的处理压力的能力较强。
方式:可以用新闻内容本身+新闻模版生成静态的新闻文件,在新闻文件上用ajax异步加载新闻的评论。
缺点:新闻页面上的其他因素成为开发起来比较麻烦的东西,比如广告、相关文章链

新闻内容如果不静态化
缺点:使用的服务器受到你的系统的架构的影响,处理压力的能力受限。
方式:可以将该新闻的内容、评论等相关因素放在一个xml里面,访问该新闻时仅仅读一个新闻xml,仅一次读IO,性能上不会有较大压力。前端可以再加一个集中式缓存(比如memcached),将读的次数非常多的新闻存在缓存中,进一步减少IO数。
有点:灵活。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
实现评论盖楼系统一般需要以下步骤: 1. 创建评论表:在MySQL中创建一个表来存储评论数据,包括评论内容、时间戳、用户ID、回复的评论ID等字段。例如: ``` CREATE TABLE comments ( id INT(11) NOT NULL AUTO_INCREMENT, user_id INT(11) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, parent_id INT(11), PRIMARY KEY (id) ); ``` 2. 编写PHP脚本:编写PHP脚本来处理用户提交的评论,并将其保存到数据库表中。需要注意的是,当用户回复某条评论时,需要保存该评论的ID作为回复的评论ID。 ``` // 连接数据库 $conn = mysqli_connect($host, $username, $password, $dbname); // 处理用户提交的评论 if ($_SERVER['REQUEST_METHOD'] == 'POST') { $user_id = $_POST['user_id']; $content = $_POST['content']; $parent_id = $_POST['parent_id']; $sql = "INSERT INTO comments (user_id, content, parent_id) VALUES ('$user_id', '$content', '$parent_id')"; mysqli_query($conn, $sql); } ``` 3. 显示评论列表:编写PHP脚本来查询数据库中的评论数据,并将其显示在页面上。需要使用递归算法来处理评论的嵌套结构,并使用CSS和JavaScript来实现评论盖楼的效果。 ``` // 获取根评论列表 $sql = "SELECT * FROM comments WHERE parent_id IS NULL"; $result = mysqli_query($conn, $sql); // 递归处理子评论列表 function showComments($parent_id, $level) { global $conn; $sql = "SELECT * FROM comments WHERE parent_id=$parent_id"; $result = mysqli_query($conn, $sql); while ($row = mysqli_fetch_assoc($result)) { echo '<div style="margin-left: ' . ($level * 20) . 'px;">'; echo '<p>' . $row['content'] . '</p>'; echo '<small>' . $row['created_at'] . '</small>'; echo '<a href="#" onclick="showReplyForm(' . $row['id'] . ')">回复</a>'; echo '<div id="reply-form-' . $row['id'] . '" style="display: none;">'; echo '<form method="post" action="#">'; echo '<input type="hidden" name="parent_id" value="' . $row['id'] . '">'; echo '<input type="text" name="content">'; echo '<input type="submit" value="提交">'; echo '</form>'; echo '</div>'; showComments($row['id'], $level + 1); echo '</div>'; } } // 显示评论列表 while ($row = mysqli_fetch_assoc($result)) { echo '<div>'; echo '<p>' . $row['content'] . '</p>'; echo '<small>' . $row['created_at'] . '</small>'; echo '<a href="#" onclick="showReplyForm(' . $row['id'] . ')">回复</a>'; echo '<div id="reply-form-' . $row['id'] . '" style="display: none;">'; echo '<form method="post" action="#">'; echo '<input type="hidden" name="parent_id" value="' . $row['id'] . '">'; echo '<input type="text" name="content">'; echo '<input type="submit" value="提交">'; echo '</form>'; echo '</div>'; showComments($row['id'], 1); echo '</div>'; } ``` 需要注意的是,为了避免SQL注入攻击,需要使用参数化查询或预处理语句来处理用户提交的数据。另外,为了安全起见,还需要进行用户身份验证和数据过滤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值