2012-02-20 172 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

另外,将记录与表单定义一起存储会产生不必要的层级,这会在读取适当级别的数据时给您带来痛苦。