MongoDB文檔關系設計——基礎篇

近些年,No-SQL數據庫興起,在存儲與處理大數據方面具備天然的優勢。但對于如何設計No-SQL數據庫的資料少之又少,很多人都是在邊實踐、邊學習,踩過不少坑。MongoDB是目前主流的No-SQL之一,文檔關系的設計是其中常見的難點。本系列文章將從基礎談起,聊聊如何將文檔關系設計做好。本文是此系列文章的第一篇,介紹文檔關系設計的基礎知識。

當開始設計MongoDB的結構(schema)時,你需要考慮一個在SQL關系型數據庫(RMDBS)不會遇到的問題:文檔之間的數量對應關系。具體來說,你需要思考one-to-N關系是one-to-few,one-to-many或者one-to-squillions三種中的哪種。根據具體的對應關系不同,你將會使用不同的關系模型。

1. 基本模型:One-to-Few

一個one-to-few的例子就是一個人的地址。在這個例子中,地址文檔(Address)適合被內嵌(embedded)在人(Person)的文檔中,可以將Address文檔以數組的方式存儲在Person的文檔中。

這種設計具有內嵌關系的優點和缺點。優點在于你無須利用一個單獨的查詢來讀取內嵌文檔的細節;主要的缺點在于你無法作為一個單獨的實體來訪問內嵌文檔的細節。

在人-地址的例子中,你可以非常方便查詢到一個人名下的所有地址,但對于查詢所有地址在某個城市的人,將會是相當困難。

2. 基本模型:One-to-Many

一個典型one-to-many的例子就是電商系統中的顧客與訂單之間的關系,而且隨著時間的增加,顧客的訂單數會逐漸增長,會達到上百,甚至上萬個。在這種情形下,非常適合使用引用(reference),將訂單的ObjectIDs存儲在一個數組中,然后內嵌在顧客的文檔中。

在這種設計中,每個訂單是一個文檔,每個顧客也是一個文檔,而且包含一個指向訂單引用的數組。那么為了獲取某個顧客的所有訂單,可以通過應用程序層面(application-level)的關聯操作來實現。為了提高查詢效率,需要對顧客的_id建立索引。由于orders._id本身就存在索引(因為_id存儲在一個數組中),所以對訂單的查詢效率通常很高。

這種內嵌文檔引用的方式既有好處,也有壞處。由于每個子文檔(訂單)是一個獨立的文檔,因而對于搜索與更新子文檔(訂單)來說,非常方便。但這種設計的一個不足之處在于,需要兩個查詢才能獲得子文檔(訂單)的詳情。比如要查詢名為張三顧客的未付款訂單詳情:第一步,根據姓名查詢顧客集合,獲取顧客張三的文檔;第二步,根據查的顧客文檔,再查詢所有未付款訂單詳情。

這種設計的一個額外好處,就是可以拓展到N-to-N關系模型,由于子文檔是獨立存在的文檔,那么子文檔可以內嵌在多個不同的父文檔中。比如在一個學校中,學生與老師之間是一個N-to-N關系,老師可以給多名學生授課,一名學生可以擁有多名授課老師。

3. 基本模型:One-to-Squillions

這是一對超多的關系,這個超多的概念可以理解為千萬級別的數據量。一個常見的例子就是應用的日志系統,日志系統收集分布式主機上的各種事件日志,這個數據非常大,而且增長迅速。即使采用日志文檔引用數組的方式進行存儲,任何一臺主機上的日志數量可以很容易超過16MB的文檔大小。此時,非常適合采用常見的父引用(parent-referencing)方式進行存儲:每臺主機擁有一個文檔,然后將主機日志文檔的引用存儲在日志消息的文檔中。

在此種情形下,你可以利用應用程序級別上的關聯查詢,來獲取某個主機上的最近5000條日志。

說明:對于BSON-document方式存儲的文件,其大小的限制是16MB,如果希望存儲更大數據大小的集合文件,可以考慮GridFS方式。更多關于GridFS的說明,可以參考官方文檔。

總結

以上是三種基本的one-to-N關系模型,當你設計MongoDB的數據庫結構時,你需要考慮兩個因素:

  • 對于N類文檔,是否需要單獨被存儲?
  • 文檔之間的具體關系是什么,是one-to-few,one-to-many,還是one-to-sequillions?

基于這兩方面的因素,你可以選擇上述三種的一種方式進行設計:

  • 如果是one-to-few關系,并且無須從父文檔之外的方式訪問N類文檔,內嵌N類文檔;
  • 如果是one-to-many關系,并且希望N類文檔以獨立的文檔存儲,那么使用N類文檔的引用數組,并內嵌在父文檔中;
  • 如果是one-to-sequillions關系,在N類文檔中存儲一個指向one類文檔的引用。

N類文檔,代表處在N這邊的文檔,在一個顧客訂單(one-to-many)關系中,N類文檔指訂單文檔,one類文檔代指顧客文檔

如果覺得此文能夠給你帶來幫助和啟發,請不要吝嗇你的贊_。同時關注該該專題,后面的章節會陸續奉獻給大家。祝各位周末愉快!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,776評論 18 139
  • 95天 (一)打電話 昨晚夢見姥姥生病了,我和姐姐去看她,她很瘦,生病了。看見我和姐姐走進房間,她努力的掙眼睛,說...
    青衣雨翼_shape閱讀 152評論 0 0
  • 變量、作用域和內存問題 變量基本類型值和引用類型值 執行環境和作用域當代碼在一個環境中執行時,會創建變量對象的一個...
    回調的幸福時光閱讀 258評論 0 0
  • 人人都自私,都恨不得為自己的行為找藉口,為自己的際遇尋發泄。人生根本涼薄如此,并不能深怪,反倒是稍稍肯讓步,容忍,...
    靜然說秩序生活閱讀 494評論 0 0
  • 今下午和女兒一起去書店買書,上次我們去書店買《紅星照耀中國》沒買到,今天但愿能買到。 到了書店,店...
    于佳禾媽媽閱讀 162評論 0 4