資料庫結構:
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 = MyISAMCOMMENT = '文章評論表';
相應文章的評論讀出來以後,我用的遞迴把評論展示出來。
但是現在有個問題,比如我一頁顯示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 = MyISAMCOMMENT = '文章評論表';
相應文章的評論讀出來以後,我用的遞迴把評論展示出來。
但是現在有個問題,比如我一頁顯示10個評論,要顯示第一頁,我現在把頂級評論讀出來了,但是這些評論下的回複怎麼查最優呢?(因為回複可能有很多級,所以我現在遞迴查詢資料庫已經。。。咳咳)
如果使用3個 id 呢, 一個是回複對象(上級回複) id, 一個是文章 id, 一個是頂級回複 id 呢, 這樣可以用頂級回複 id 一次性去取全部的, 再根據時間排序好樓層, 還需要一個欄位標記不是回複別人而是直接評論文章, 加入這個條件來分頁
其實不建議蓋那麼多樓層, 一次就好, 想 sf 這樣, 評論都在現在, 使用 @xxx 的方式就好, 當然直觀性不如蓋樓
也會引發出一些問題, 比如中間樓層被管理員刪除等...
非常好的問題。
這種無限級的問題,其實有很多種解法,最簡單但效率不一定是最低的實現方法就是遞迴。
在實際項目中,這樣無限的蓋樓和引用不會超過10層。
所以,在資料量可控的情況下其實是沒有太大問題的。
但在分頁時只取子評論ID,且最好把評論的結構存放到緩衝中,在記憶體中排序量並不會很大。
基於現在的表結構,最佳化的方法則是加上一個欄位,所有子評論ID,用逗號等分隔字元串連直接,減少遞迴時的查詢。
Mysql的資料類型很單一,換成或搭配Redis、Mongo、PostgreSql、oracle便可通過儲存為格式化的資料結構簡單解決。