我正在创建一个带有动态调查创建的Web应用程序。提交组件。我正在使用MongoDB来存储表单和表单提交的模式。
我可以想象以几种不同的方式组织这个:
将所有表单提交和表单架构作为单个集合中的文档。
为所有表单架构和所有表单提交单独的集合
为所有表单架构设置单独的集合,并为每个架构的表单的所有提交创建一个新集合。
我还在研究这个,我来自RDBMS的世界,我是NoSQL数据库的小伙子。有人有什么建议吗?
编辑1 忘记将响应作为属性嵌入到表单模式文档中。
答案 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