2013-07-22 59 views
0

我正在構建一個使用MongoDB作爲數據庫的應用程序。我有很多產品,並且我想記錄用戶查看用戶數據庫條目的產品。例如,用戶配置文件如下所示:MongoDB - 多少數據太多數據?

{ 
    "email" : "[email protected]", 
    "name" : "John Snow", 
    "_id" : ObjectId("51ecbcc6896652a008000001"), 
    "productsViewed" : [ 
      product1, 
      product2, 
      product3, 
      product4 
    ] 
} 

我在這裏有兩個選項。我可以只記錄每個產品的_id,或者我可以記錄代表產品的全部對象(名稱,價格,〜100字描述,類別等等)。對象尺寸的差異是每個產品1行文本,每個產品約30行。

我意識到這可能是一個微不足道的數據量,但如果一個用戶擁有10,000個productsViewed條目,大約30倍的差異會產生什麼樣的影響?記錄更多的數據對我來說遠爲有用,但是如果用戶配置文件變得非常大,我想避免數據庫調用滯後。

的問題是:在什麼時候(以字符長度,我猜?)太多的數據存儲與一個MongoDB的記錄?

回答

2

16兆是整個文檔的限制。這意味着所有的字符串等都必須在16兆以內。然而,在此之前也有你的架構的更多限制你,你自己暗示:

但是如果用戶擁有10000個productsViewed條目,將在〜30X相差較大作出任何形式的影響?

答案是肯定的。首先使用根用戶的附加數據,您可能會超過16兆的限制,但是,由此進一步導致內存中的$pull$push和其他子文檔運營商可能難以保持性能。您可以通過將您的子文檔批量分組到100來減輕這個問題。

但是,又一次,您遇到了更大的問題:碎片。由於MongoDB將記錄存儲在磁盤上的單個連續空間中,因此它具有像填充這樣的設置,因此您可以看到很多奇數大小的記錄對象在這裏沒有被重用的碎片。

我個人認爲你應該把這個關係分解爲一個單獨的集合。

+0

有趣。你能解釋一下「整個文件」是什麼意思嗎?我知道哪些數據庫,集合和記錄與'MongoDB'有關,但不知道'文檔'是指什麼。 – Jascination

+0

@Jascination在這種情況下,文檔=記錄和記錄對象= MongoDBs記錄的內部表示 – Sammaye