評論應該怎麼讀取?

來源:互聯網
上載者:User
資料庫結構:

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便可通過儲存為格式化的資料結構簡單解決。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.