数据库结构:
CREATE TABLE IF NOT EXISTS `Blog`.`comments` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '评论ID', `content` TEXT NOT NULL COMMENT '评论内容', `create_time` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '评论时间', `author` VARCHAR(45) NOT NULL DEFAULT '' COMMENT '作者名称', `ip` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'IP', `url` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '网址', `email` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '邮箱', `agent` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '浏览器信息', `parent_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级ID', `status` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '状态', `article_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '评论的文章ID', PRIMARY KEY (`id`), INDEX `fk_article_comments_article1_idx` (`article_id` ASC)) ENGINE = MyISAM COMMENT = '文章评论表';
相应文章的评论读出来以后,我用的递归把评论展示出来。
但是现在有个问题,比如我一页显示10个评论,要显示第一页,我现在把顶级评论读出来了,但是这些评论下的回复怎么查最优呢?(因为回复可能有很多级,所以我现在递归查询数据库已经。。。咳咳)
回复内容:
数据库结构:
CREATE TABLE IF NOT EXISTS `Blog`.`comments` ( `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '评论ID', `content` TEXT NOT NULL COMMENT '评论内容', `create_time` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '评论时间', `author` VARCHAR(45) NOT NULL DEFAULT '' COMMENT '作者名称', `ip` VARCHAR(100) NOT NULL DEFAULT '' COMMENT 'IP', `url` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '网址', `email` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '邮箱', `agent` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '浏览器信息', `parent_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父级ID', `status` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '状态', `article_id` INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '评论的文章ID', PRIMARY KEY (`id`), INDEX `fk_article_comments_article1_idx` (`article_id` ASC)) ENGINE = MyISAM COMMENT = '文章评论表';
相应文章的评论读出来以后,我用的递归把评论展示出来。
但是现在有个问题,比如我一页显示10个评论,要显示第一页,我现在把顶级评论读出来了,但是这些评论下的回复怎么查最优呢?(因为回复可能有很多级,所以我现在递归查询数据库已经。。。咳咳)
如果使用3个 id 呢, 一个是回复对象(上级回复) id, 一个是文章 id, 一个是顶级回复 id 呢, 这样可以用顶级回复 id 一次性去取全部的, 再根据时间排序好楼层, 还需要一个字段标记不是回复别人而是直接评论文章, 加入这个条件来分页
其实不建议盖那么多楼层, 一次就好, 想 sf 这样, 评论都在现在, 使用 @xxx 的方式就好, 当然直观性不如盖楼
也会引发出一些问题, 比如中间楼层被管理员删除等...
在整本书中我们所涉及许多的Flex框架源码,但为了简洁,我们不总是显示所指的代码。当你阅读这本书时,要求你打开Flex Builder,或能够访问Flex3框架的源码,跟随着我们所讨论源码是怎么工作及为什么这样做。 如果你跟着阅读源码,请注意,我们经常跳过功能或者具体的代码,以便我们可以对应当前的主题。这样能防止我们远离当前的主题,主要是讲解代码的微妙之处。这并不是说那些代码的作用不重要,而是那些代码处理特别的案例,防止潜在的错误或在生命周期的后面来处理,只是我们当前没有讨论它。有需要的朋友可以下载看看
非常好的问题。
这种无限级的问题,其实有很多种解法,最简单但效率不一定是最低的实现方法就是递归。
在实际项目中,这样无限的盖楼和引用不会超过10层。
所以,在数据量可控的情况下其实是没有太大问题的。
但在分页时只取子评论ID,且最好把评论的结构存放到缓存中,在内存中排序量并不会很大。
基于现在的表结构,优化的方法则是加上一个字段,所有子评论ID,用逗号等分隔符连接直接,减少递归时的查询。
Mysql的数据类型很单一,换成或搭配Redis、Mongo、PostgreSql、oracle便可通过存储为格式化的数据结构简单解决。









