來源:轉(zhuǎn)載 發(fā)布時(shí)間:2018-11-01 10:12:36 閱讀量:976
1、概述
評(píng)論功能已經(jīng)成為APP和網(wǎng)站開發(fā)中的必備功能。本文主要介紹評(píng)論功能的數(shù)據(jù)庫設(shè)計(jì)。
評(píng)論功能最主要的是發(fā)表評(píng)論和回復(fù)評(píng)論(刪除功能在后臺(tái))。評(píng)論功能的拓展功能體現(xiàn)有以下幾方面:
(1)單篇文章的評(píng)論數(shù)量和信息展示;
(2)從時(shí)間維度,按照時(shí)間倒敘的方式展示動(dòng)態(tài)的用戶評(píng)論信息;
(3)不同欄目,不同模塊,不同時(shí)間維度的評(píng)論排行展示;
(4)精華評(píng)論的單獨(dú)推薦和聚合展示;
(5)評(píng)論后直接分享到綁定的第三方平臺(tái);
(6)點(diǎn)贊數(shù)、回復(fù)數(shù)等維度的排行等。
評(píng)論的后臺(tái)管理:
(1)刪除;
(2)推薦;
(3)精華;
(4)屏蔽,敏感關(guān)鍵字的庫的完善、自動(dòng)屏蔽或者替換功能。
本篇文章主要分析幾種客戶端評(píng)論數(shù)據(jù)表的設(shè)計(jì)。
2、數(shù)據(jù)表設(shè)計(jì)
2.1 一問一答模式
(1)需求分析
大部分APP采用簡(jiǎn)單的評(píng)論設(shè)計(jì)即可,即是一問一答模式,比如微信朋友圈的評(píng)論功能的設(shè)計(jì)。如:
A:今天天氣真好!
B @ A :今天天氣確實(shí)不錯(cuò)!
1
2
這種設(shè)計(jì)簡(jiǎn)單、直接,也滿足了用戶評(píng)論、回復(fù)的基本要求,對(duì)于沒有大量用戶評(píng)論的APP需求足夠。
(2)數(shù)據(jù)庫設(shè)計(jì)
這種場(chǎng)景下一般評(píng)論較少,評(píng)論不活躍,可以不區(qū)分評(píng)論和回復(fù),統(tǒng)一看成評(píng)論。區(qū)別是,有些評(píng)論是直接評(píng)論主題,而有些是@其他用戶,使用一張表就可以達(dá)到效果,評(píng)論表設(shè)計(jì)如下:
表字段 字段說明
id 主鍵
topic_id 主題id
topic_type 主題類型
content 評(píng)論內(nèi)容
from_uid 評(píng)論用戶id
to_uid 評(píng)論目標(biāo)用戶id
topic_type:為了能復(fù)用評(píng)論模塊,我們引入這個(gè)字段來區(qū)分主題的類別。
from_uid:表示評(píng)論人的id,通過該id我們可以檢索到評(píng)論人的相關(guān)信息。
to_uid 是評(píng)論目標(biāo)人的id,如果沒有目標(biāo)人,則該字段為空
出于性能的考慮,往往我們會(huì)冗余評(píng)人的相關(guān)信息到評(píng)論表中,比如評(píng)論人的nick、頭像,目標(biāo)用戶也是如此。 這樣一來我們就只用查詢單表就可以達(dá)到顯示的效果
有時(shí),目標(biāo)用戶有多個(gè),那么可以將to_uid字段修改為to_uids,保存時(shí)用分隔符來分割用戶id,而目標(biāo)用戶的信息再去查詢緩存或者數(shù)據(jù)庫。也可以簡(jiǎn)單的將多個(gè)目標(biāo)用戶的信息一起存成json格式,可以應(yīng)付簡(jiǎn)單的展現(xiàn)需求。
2.2 評(píng)論為主模式
(1)需求分析
如果以評(píng)論為主的顯示模式,類似于下面的CSDN的評(píng)論顯示模式:
這里將評(píng)論分為評(píng)論和回復(fù),所有評(píng)論均掛在評(píng)論下面,類似于樹狀結(jié)構(gòu)。
(2)數(shù)據(jù)庫設(shè)計(jì)
在以評(píng)論為主的樹形顯示情況下,數(shù)據(jù)庫的設(shè)計(jì)十分靈活,可以使用單表,添加一個(gè)parent_id字段來指向父評(píng)論,需要嵌套查詢。
同時(shí)也可以將評(píng)論拆分為評(píng)論表和回復(fù)表,評(píng)論掛在各種主題下面,而回復(fù)掛在評(píng)論下面。
評(píng)論表設(shè)計(jì)如下:
表字段 字段說明
id 主鍵
topic_id 主題id
topic_type 主題類型
content 評(píng)論內(nèi)容
from_uid 評(píng)論用戶id
回復(fù)表設(shè)計(jì):
表字段 字段說明
id 主鍵
comment_id 評(píng)論id
reply_id 回復(fù)目標(biāo)id
reply_type 回復(fù)類型
content 回復(fù)內(nèi)容
from_uid 回復(fù)用戶id
to_uid 目標(biāo)用戶id
由于我們拆分了評(píng)論和回復(fù),那么評(píng)論表就不再需要目標(biāo)用戶字段了,因?yàn)樵u(píng)論均是用戶對(duì)主題的評(píng)論,評(píng)論表的設(shè)計(jì)更佳簡(jiǎn)潔了。
回復(fù)表添加了一個(gè)comment_id字段來表示該回復(fù)掛在的根評(píng)論id,這樣設(shè)計(jì)也是出于性能方面的考慮,我們可以直接通過評(píng)論id一次性的找出該評(píng)論下的所有回復(fù),然后通過程序來編排回復(fù)的顯示結(jié)構(gòu)。 通過適當(dāng)?shù)娜哂鄟硖岣咝阅芤彩浅S玫膬?yōu)化手段之一。
reply_type:表示回復(fù)的類型,因?yàn)榛貜?fù)可以是針對(duì)評(píng)論的回復(fù)(comment),也可以是針對(duì)回復(fù)的回復(fù)(reply), 通過這個(gè)字段來區(qū)分兩種情景。
reply_id:表示回復(fù)目標(biāo)的id,如果reply_type是comment的話,那么reply_id=commit_id,如果reply_type是reply的話,這表示這條回復(fù)的父回復(fù)。
2.3 網(wǎng)易新聞蓋樓模式
(1)需求分析
這種場(chǎng)景中評(píng)論和回復(fù)是同級(jí)顯示的,回復(fù)不在顯示結(jié)構(gòu)上不用掛在一個(gè)評(píng)論下面。 雙表的設(shè)計(jì)在這里就不太合適了,因?yàn)樯婕暗皆u(píng)論和回復(fù)的混排,使用雙表則會(huì)導(dǎo)致查詢的邏輯過于復(fù)雜。 所以建議還是采用單表的設(shè)計(jì),不區(qū)分評(píng)論和回復(fù)會(huì)簡(jiǎn)化應(yīng)用層的邏輯。 我們統(tǒng)一都看成評(píng)論,而有些評(píng)論是可以引用其他評(píng)論的。
(2)數(shù)據(jù)庫設(shè)計(jì)
本人推薦采用閉包表的設(shè)計(jì),例如:
comment表設(shè)計(jì):
表字段 字段說明
id 主鍵
topic_id 主題id
topic_type 主題類型
content 評(píng)論內(nèi)容
from_uid 評(píng)論用戶id
parent_child表:
表字段 字段說明
id 主鍵
parent_id 父id
child_id 子id
comment表保存所有評(píng)論內(nèi)容,而parent_children表則記錄評(píng)論表中各個(gè)評(píng)論的父子關(guān)系。
查詢時(shí)往往會(huì)按照時(shí)間排序,我們可以直接按id或者創(chuàng)建時(shí)間降序排列查詢comment表即可。 如果用戶想查詢一條評(píng)論的完整引用,則可以通過parent_children來找到對(duì)應(yīng)的路徑。
閉包表在查詢時(shí)非常方便,但是插入的性能稍差,因?yàn)槌瞬迦朐u(píng)論表以外,還需要把該條評(píng)論所有的父子關(guān)系插入到父子關(guān)系表中。 插入性能會(huì)隨著評(píng)論層級(jí)的加深而線性下降。
3、數(shù)據(jù)庫優(yōu)化
如果你的系統(tǒng)每天都會(huì)擁有成千上萬條評(píng)論,那么單表的設(shè)計(jì)肯定是不行,優(yōu)化的方式有以下幾種思路。
(1)分庫分表。 分庫分表是最為常用也最有效的優(yōu)化方式,建議按照主題來分庫分表。 這樣同一個(gè)主題下面的評(píng)論就會(huì)落到同一張表里,避免了跨表查詢。
(2)適當(dāng)?shù)臄?shù)據(jù)冗余。 如果你需要顯示評(píng)論人的相關(guān)信息,那么在插入評(píng)論時(shí)就把這些信息寫入評(píng)論表中,避免多次查詢。 實(shí)際上,如果是紀(jì)錄數(shù)據(jù),都可以冗余對(duì)應(yīng)的數(shù)據(jù)信息,因?yàn)樗鼈兊臄?shù)據(jù)的實(shí)時(shí)行和一致性要求并不高。
(3)附加冪。數(shù)據(jù)只允許單項(xiàng)操作。 因?yàn)閺膬缧缘囊髞碚f,每個(gè)贊全都是一條記錄。 評(píng)論的贊數(shù)如果都從點(diǎn)贊表中統(tǒng)計(jì)得出,那么性能開銷會(huì)十分巨大,而且點(diǎn)贊如此輕量級(jí)的一個(gè)操作一定會(huì)加劇點(diǎn)贊表的競(jìng)爭(zhēng)操作。 所以建議直接在評(píng)論表中添加一個(gè)like_count的計(jì)數(shù)器,該字段只增不減??蛻舳耍梢栽O(shè)置取消效果。
(4)熱門評(píng)論加緩存。 類似于網(wǎng)易新聞的熱門評(píng)論,讀取頻度非常高,可以專門開接口做緩存。
---------------------
作者:chun_soft
來源:CSDN
原文:https://blog.csdn.net/ztchun/article/details/71106117
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請(qǐng)附上博文鏈接!
在線
客服
服務(wù)時(shí)間:周一至周日 08:30-18:00
選擇下列產(chǎn)品馬上在線溝通:
客服
熱線
7*24小時(shí)客服服務(wù)熱線
關(guān)注
微信
關(guān)注官方微信