2012-02-20 54 views
3

我一直在閱讀一些關於MongoDB的文檔設計,特別是關於引用,嵌入和鏈接的文檔設計。MongoDB的正確文檔設計

我還不確定什麼樣的最佳佈局是我想存儲的那種文檔。

想象一下,如果你願意,一種動態表單構建應用程序。每個表單都有一組靜態屬性(名稱,描述等),一組動態創建的字段(name = text,age = number等)和一組提交的結果。

事情是這樣的:

$obj = array(
    'name' => 'Test', 
    'description' => 'Hello', 
    'live' => false, 
    'meta' => array (
     'name' => 'text', 
     'age' => 'number', 
     'sex' => 'boolean', 
    ), 
    'records' => array(
     array('name' => 'Test', 'age' => 20, 'sex' => true), 
     ... 
     ... 
    ) 
); 

我的困惑主要來自是否我應該集合內嵌入的記錄,或者我是否應該爲每個單獨的形式收藏。我的直覺是做後者,而我一直在閱讀的MongoDB書籍中說嵌入數據是可以的。

有人可以協助,因爲我希望表單有大量的提交數據。

謝謝。

編輯: 我還發現this question是有幫助的。

+0

這個問題屬於程序員.stackexchange.com – 2012-02-20 15:17:59

+0

這就是說,答案是「它取決於」。如果您只需要在特定表單的上下文中訪問/查詢記錄,請嵌入它們。如果您需要獨立訪問/查詢它們,您可能需要創建一個單獨的集合。 – 2012-02-20 15:19:25

+0

@BenLee:如果我需要某些字段類型的地理空間索引,單獨收集方法會更有利嗎?我想不出在表單上下文之外需要表單提交的情況,但是就性能而言,我認爲在單個集合中混合不同表單的記錄會在磁盤上創建非連續數據並且隨着越來越多的記錄被提交而降低查詢性能? – Leigh 2012-02-20 15:30:06

回答

3

我會將所有表單定義存儲在一個集合中,並將表單提交存儲在另一個集合中。您需要認識到一個文檔(包括嵌入文檔)現在只能有16 MB。

在單獨的收藏中提交提交更有意義。您是否想要爲您的每種表單類型獲得不同的集合。這取決於每種形式的相似程度,以及您將獲得多少種不同類型。

您不必擔心MongoDB會在磁盤上創建非連續的數據,因爲Mongo分別存儲每個文檔,並且不關心哪些字段是文檔的一部分。

+0

我可能錯誤地想起了關於預分配的一些事情,並認爲它是在集合級別而不是數據庫級別。我現在也無法找到我現在閱讀的地方。感謝您確認我的直覺,將我的記錄分成不同的集合。如果我嵌入,16MB限制**將成爲問題。沒有人知道這些形式會有多相似或不同,它們是動態的,只有客戶才能設計出來,我認爲每種形式的單獨收集方式都是可行的。乾杯。 – Leigh 2012-02-20 16:01:46

0

另外,將記錄與表單定義一起存儲會產生不必要的層級,這會在讀取適當級別的數據時給您帶來痛苦。