使用mongodb进行表单构建Web应用程序,模式考虑

时间:2012-01-26 00:05:56

标签: mongodb schema database nosql

我正在创建一个带有动态调查创建的Web应用程序。提交组件。我正在使用MongoDB来存储表单和表单提交的模式。

我可以想象以几种不同的方式组织这个:

  1. 将所有表单提交和表单架构作为单个集合中的文档。

  2. 为所有表单架构和所有表单提交单独的集合

  3. 为所有表单架构设置单独的集合,并为每个架构的表单的所有提交创建一个新集合。

  4. 我还在研究这个,我来自RDBMS的世界,我是NoSQL数据库的小伙子。有人有什么建议吗?


    编辑1 忘记将响应作为属性嵌入到表单模式文档中。

2 个答案:

答案 0 :(得分:2)

  

将所有表单提交和表单模式作为单个集合中的文档。

你会想要避免这个(#1)。这里的简单原因是提交形式与 schema 形式具有不同的角色。将它们混合在同一个集合中会使查询更加困难。

  

为所有表单架构和所有表单提交单独的集合

为了澄清,听起来你建议两个集合:schema and提交。

这是一种合乎逻辑的方式。您将拥有一个小型schema集合和一个大型submission集合。

关键限制是您针对submission集合进行的查询。您打算查询“跨类型”吗?或者是以“提交类型”为中心的主要疑问?

如果您最终在每个查询中都包含“提交类型”,那么......

就有意义了
  

为所有表单模式设置单独的集合,并为每个模式的表单的所有提交创建一个新集合。

原因只是索引。如果您有一个集合,则需要“类型”索引。因此,通过创建单独的集合,您可以保存索引。但是,如果您最终需要分片功能,则可以管理大量的集合。

当然,您可以通过_id创作来解决这个“额外索引”。 MongoDB有一个默认使用的自动生成的ObjectId,有点像自动增量ID。但是,您可以覆盖此设置并创建更智能的_id,例如submissionid_userid

我的偏好是老实说最后一个选择。但真的#2& #3都是不错的选择,实际上只是在代码复杂性和管理复杂性方面的权衡问题。

答案 1 :(得分:1)

我会选择两个系列:表单提交

这种方法可以横向扩展,因为您只需要担心2个集合 我同意@Gates VP关于提供自定义_id而不是默认objectId,因为您不需要额外的索引。

submissions集合中,如果您将_id格式设置为formID_userID以获取所有提交内容,则需要执行以下操作:

db.submissions.find({'_id': '^formID'})

这里的奖励是锚定的正则表达式将使用_id_索引 - 所以它的效率。


一般参考和其他绊脚石:有一些关于模式设计的好的演示 - 值得一试:

http://www.10gen.com/presentations/mongodb-tokyo-2012/basic-application-and-schema-design http://www.10gen.com/presentations/mongosv-2011/schema-design-principles-and-practice