1. 程式人生 > >MongoDB資料建模小案例:朋友圈評論內容管理

MongoDB資料建模小案例:朋友圈評論內容管理

需求

社交類的APP需求,一般都會引入“朋友圈”功能,這個產品特性有一個非常重要的功能就是評論體系。
先整理下需求:

  • 這個APP希望點贊和評論資訊都要包含頭像資訊:

    1. 點贊列表,點贊使用者的暱稱,頭像;
    2. 評論列表,評論使用者的暱稱,頭像;
  • 資料查詢則相對簡單:

    1. 根據分享ID,批量的查詢出10條分享裡的所有評論內容;

建模

不好的

跟據上面的內容,先來一個非常非常"樸素"的設計:

{
  "_id": 41,
  "username": "小白",
  "uid": "100000",
  "headurl": "http://xxx.yyy.cnd.com/123456ABCDE",
  "praise_list"
: [ "100010", "100011", "100012" ], "praise_ref_obj": { "100010": { "username": "小一", "headurl": "http://xxx.yyy.cnd.com/8087041AAA", "uid": "100010" }, "100011": { "username": "mayun", "headurl": "http://xxx.yyy.cnd.com/8087041AAB", "uid": "100011" }, "100012": { "username"
: "penglei", "headurl": "http://xxx.yyy.cnd.com/809999041AAA", "uid": "100012" } }, "comment_list": [ "100013", "100014" ], "comment_ref_obj": { "100013": { "username": "小二", "headurl": "http://xxx.yyy.cnd.com/80232041AAA", "uid": "100013", "msg": "good" }, "100014"
: { "username": "小三", "headurl": "http://xxx.yyy.cnd.com/11117041AAB", "uid": "100014", "msg": "bad" } } }

可以看到,comment_ref_objpraise_ref_obj兩個欄位,有非常重的關係型資料庫痕跡,猜測,這個系統之前應該是放在了普通的關係型資料庫上,或者設計者被關係型資料庫的影響較深。而在MongoDB這種文件型資料庫裡,實際上是沒有必要這樣去設計,這種建模只造成了多於的資料冗餘。

另外一個問題是,url佔用了非常多的資訊空間,這點在壓測的時候會有體現,頻寬會過早的成為瓶頸。同樣username資訊也是如此,此類資訊相對來說是全域性穩定的,基本不會做變化。並且這類資訊跟隨評論一起在整個APP中流轉,也無法結局”使用者名稱修改“的需求。

根據這幾個問題,重新做了優化的設計建議。

推薦的設計

{
  "_id": 41,
  "uid": "100000",
  "praise_uid_list": [
    "100010",
    "100011",
    "100012"
  ],
  "comment_msg_list": [
    {
      "100013": "good"
    },
    {
      "100014": "bad"
    }
  ]
}

對比可以看到,整個結構要小了幾個數量級,並且可以發現url,usrname資訊都全部不見了。那這樣的需求應該如何去實現呢?

從業務抽象上來說,url,username這類資訊實際上是非常穩定的,不會發生特別大的頻繁變化。並且這兩類資訊實際上都應該是跟uid繫結的,每個uid含有指定的url,username。是最簡單的key,value模型。所以,這類資訊非常適合做一層快取加速讀取查詢。

進一步的,每個人的好友基本上是有限的,頭像,使用者名稱等資訊,甚至可以在APP層面進行快取,也不會消耗移動端過多容量。但是反過來看,每次都到後段去讀取,不但浪費了移動端的流量頻寬,也加劇了電量消耗。

總結

MongoDB的文件模型固然強大,但絕對不是等同於關係型資料庫的粗暴聚合,而是要考慮需求和業務,合理的設計。有些人在設計時,也會被文件模型誤導,三七二十一一股腦的把資訊塞到一個文件中。反而最後會帶來各種使用問題。

原文地址:https://yq.aliyun.com/articles/66120?spm=5176.100239.blogcont73664.26.h8eZaz

相關推薦

MongoDB資料建模案例朋友評論內容管理

需求 社交類的APP需求,一般都會引入“朋友圈”功能,這個產品特性有一個非常重要的功能就是評論體系。 先整理下需求: 這個APP希望點贊和評論資訊都要包含頭像資訊: 點贊列表,點贊使用者的暱稱,頭像;評論列表,評論使用者的暱稱,頭像; 資料查詢則相對簡單: 根據分享ID,批量的查詢出10條分享裡的

MongoDB資料建模案例物聯網時序資料庫建模

注:本案例來自MongoDB官方教程PPT,也是一個非常典型的CASE,故此翻譯,並結合當前MongoDB版本做了一些內容上的更新。 本案例非常適合與IoT場景的資料採集,結合MongoDB的Sharding能力,文件資料結構等優點,可以非常好的解決物聯網使用場景。

Java初學者練習案例猜數字遊戲

對於剛接觸java的小白來說,一定不能死記硬學,要先找到樂趣,讓他們產生濃厚的興趣,興趣是最好的老師,然後再培養學習的習慣和方法,

【JavaScript】動畫-案例小球運動

rand ner res onf mage borde 技術 star 初始 最近的講js運動框架時,做了一個小案例,隨機生成幾個小球,然後讓他們在頁面中跳動,碰到邊界就彈回來並修改顏色。效果如下: 代碼如下: 1 <!doctype html>

葉聰朋友背後的計算機視覺技術與應用

平臺 假設 計算 互動 hog 雲計 做成 基於 出發 歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐幹貨哦~ 本文由雲加社區技術沙龍 發表於雲+社區專欄 演講嘉賓:葉聰,騰訊雲AI和大數據中心高級研發工程師。在多年的雲計算系統研發經歷中,負責領導了多個百萬級用戶

從零到一學習計算機視覺朋友爆款背後的計算機視覺技術與應用 | 公開課筆記...

分享人 | 葉聰(騰訊雲 AI 和大資料中心高階研發工程師)整    理 | Leo出    品 | 人工智

日記俠朋友文案還可以這樣寫?就算廣告你也不討厭

你好,我是王剛,行走於網路江湖的“日記俠”。每天分享我的思考和經驗,希望身邊的人可以和我一樣天天寫日記,今天是王剛日記第556天。都說朋友圈文案要寫得有趣,高手寫成廣告也不煩啊....../ 1 /一說起朋友圈文案就頭疼,雖然曾經學了很多相關知識,但是發出去一看就是售賣資訊,

微信程式分享朋友

微信小程式暫時沒有分享到朋友圈的功能,分享的思路是用 canvas畫布生成一張分享圖片,儲存到相簿,使用者將帶有分享二維碼的圖片發到朋友圈,其他人可以識別圖中二維碼的方式進入小程式的指定分享頁面。可參考智行火車票的助力搶票功能。 1、wxml檔案 <view class='s

微信程式頁面跳轉傳參填充資料案例

把index.wxml中data-postid的值,傳給detail.wxml的案例: 目錄結構: 1、在index.wxml中為需要傳值的列表繫結屬性和值,併為該列表繫結一個點選函式:

Python爬蟲案例豆瓣電影TOP250

原始碼: #!/usr/bin/python3 # -*-coding: UTF-8-*- from urllib import request import re class MovieTop250(object): def __init

微信程式引爆朋友的祕密

昨天,也就是2017年1月9日,微信上線重磅功能“小程式”,一時間刷爆了朋友圏。從來沒有一款產品像“微信”一樣如此引人注目,從來沒有一個應用像“小程式”一樣被如此多的人病毒式的傳播。曾經有人說過,如果使用者願意主動將一個產品分享和推薦給他的朋友,那麼這個產品才是

《java入門第一季》之HashSet案例獲取10個1至20的隨機數,要求隨機數不能重複

這是基於HashSet集合的唯一性。 /*  * 編寫一個程式,獲取10個1至20的隨機數,要求隨機數不能重複。  *   * 分析:  * A:建立隨機數物件  * B:建立一個HashSet集合

程式仿朋友選擇位置之高德地圖API

說明 因專案需要,該功能類似於微信朋友圈釋出時的選擇位置 思路 可使用第三方地圖服務商的API,根據當前位置查詢POI列表,再展示在小程式的介面上 ##效果: 程式碼實現 1、申請Key,並下載核心SDK 2、設定安全通訊域名

jQuery——案例點選圖片放大縮小

需求: HTML中有三張圖片: 如果圖片處於“大”狀態,則點選圖片可以縮小。 如果圖片處於“小”狀態,則點選圖片可以放大。 程式碼: <!DOCTYPE html> <html>

微信程式分享朋友的實現思路與解決辦法

原文:http://www.wxapp-union.com/portal.php?mod=view&aid=3708簡介截止我寫這篇文章的時候,小程式應該是還沒有能夠直接分享到朋友圈的api,轉發給朋友和群是可以實現的,這篇文章主要是講如何實現分享到朋友圈,所以分享給

微信程式--仿微信程式朋友Pro(內容釋出、點贊、評論、回覆評論)

#### 微信小程式--仿微信小程式朋友圈Pro(內容釋出、點贊、評論、回覆評論) 專案開源地址[M朋友圈Pro 求個Star](https://gitee.com/Kindear/CloudUI) > 專案背景 ​ 基於原來的開源專案 [微信小程式仿朋友圈功能開發(釋出、點贊、評論等功能)](htt

案例使用KVM命令集管理虛擬機

pri virt fun ble -o 虛擬 snap network ges 一、KVM基本功能管理 1、查看命令幫助 virsh -h 或者virsh --help 2、查看KVM配置文件存放目錄 ls /etc/libvirt/qemu 3、查看虛擬機狀

android朋友評論功能相容沉浸式狀態列,九宮格圖片顯示

android朋友圈評論功能,沉浸式狀態列,九宮格圖片顯示器,上拉載入下拉重新整理功能,可直接用到專案中 背景 在前兩個專案開發過程中用到了朋友圈這個功能,包含了評論回覆、九宮格圖片及大圖展示展示,上拉載入下拉重新整理,RecyclerView和第三方封裝的萬能介面卡,自己根據使

MongoDB應用案例使用 MongoDB 儲存日誌資料

線上執行的服務會產生大量的執行及訪問日誌,日誌裡會包含一些錯誤、警告、及使用者行為等資訊,通常服務會以文字的形式記錄日誌資訊,這樣可讀性強,方便於日常定位問題,但當產生大量的日誌之後,要想從大量日誌裡挖掘出有價值的內容,則需要對資料進行進一步的儲存和分析。 本文以儲存 web 服務的訪問日誌為例,介紹如

朋友資料你的朋友出賣了你,大資料就是這麼給力!!!

很多老觀念早該顛覆了,比如“路遙知馬力,日久見人心”。據統計,現代人看篇文章平均不超過5分鐘、每次嘿咻平均不超過6分鐘。如此講究效率,哪有心思體驗“馬力”,哪有工夫跟你“日久”! 大資料時代,交友越來越講究快、狠、準。比如微信,噴得來就玩,噴不來立馬拉黑。 現代人飯局多,往往八竿子打