最近項目中碰到了一個需求:對一條新聞實現點贊功能(點贊,取消點贊,是否已點贊):web
一:一開始是打算在新聞表中用一個字段來記錄這條新聞的點贊總數,後面想到假設有不少人對這條新聞進行點贊和取消點讚的操做的話,沒作一個操做都要進行一次數據庫的讀寫,會比較消耗性能,因此後面轉變了一下思路:設計一張中間表記錄下用戶id,新聞id,點讚的時候新建一條數據,取消點讚的話就刪除一條數據,而後這條新聞的點贊數,是否已點贊(登陸用戶)就均可以獲得了;點贊數的話只要根據新聞id統計下數量便可,是否已點贊:只需根據用戶id,新聞id查找是否存在記錄便可;咱們還能夠在中間表中添加一個字段source_type來表示來自哪一個終端(web,wechat等),後續就能夠統計各個終端的狀況了;如今的中間表以下:sql
新聞點贊表: id 、repId(新聞id)、userId(用戶id)、sourceType(來源終端);
二:如今的新聞通常下面都會有網友的評論,雖然項目暫時還無需實現這樣的要求,可是咱們也能夠來思考一下。按照上面點贊功能的思路,評論是否是也能夠借鑑一下呢?可能咱們會想再加一個關聯表:數據庫
評論表: id 、repId(新聞id)、userId(用戶id)、sourceType(來源終端)、content(評論內容)、createDate(建立時間)、updateDate(修改時間);
這樣的話咱們就能夠實現功能:根據repId獲取某條新聞的所有平論、顯示評論的時間等;性能
三:咱們在今日頭條上看新聞的時候會發現評論也是能夠點讚的,那咱們就再思考一下,有同窗會想和上面的新聞點贊表同樣再加個評論點贊表,這樣的話其實有些多餘,咱們能夠將原有的新聞點贊表改造一下,添加一個點贊資源類型resourceType(用於表示點讚的是哪類資源,好比新聞、評論),而後還須要再加一個resourceId用來表示具體那條資源,完整表結構以下:spa
資源點贊表: id 、resourceType(資源類型)、resourceId(資源id)、userId(用戶id)、sourceFrom(來源終端);
四:一樣類比今日頭條,網友能夠對評論進行回覆,每條評論都有被回覆的總數等功能(例如:「xxx回覆了xxx:xxxxxxx」),該如何實現呢?設計
仍是經過改造評論表,能夠添加一個回覆給哪條評論的字段replyTo,其值是被回覆的評論的id;最外層的評論(相似組織機構)的replyTo字段設置爲0即 可;這樣經過sql就能夠統計出某條評論的回覆數,而後關聯用戶表便可實現xxx恢復了xxx;改造後的評論表以下:資源
評論表: id 、repId(新聞id)、replyTo(回覆給哪條評論的id)、userId(用戶id)、sourceType(來源終端)、content(評論內容)、createDate(建立時間)、updateDate(修改時間);