MongoDB資料建模小案例:朋友圈評論內容管理
需求
社交類的APP需求,一般都會引入“朋友圈”功能,這個產品特性有一個非常重要的功能就是評論體系。
先整理下需求:
-
這個APP希望點贊和評論資訊都要包含頭像資訊:
- 點贊列表,點贊使用者的暱稱,頭像;
- 評論列表,評論使用者的暱稱,頭像;
-
資料查詢則相對簡單:
- 根據分享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_obj
與praise_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分鐘。如此講究效率,哪有心思體驗“馬力”,哪有工夫跟你“日久”! 大資料時代,交友越來越講究快、狠、準。比如微信,噴得來就玩,噴不來立馬拉黑。 現代人飯局多,往往八竿子打