【发布时间】:2012-02-14 16:55:59
【问题描述】:
我有一个使用关系数据库 (MySQL) 的 Web 应用程序。我们正在添加一项新功能,允许某些用户从可选表单元素池中动态构建“表单”,并将这些表单分发给其他用户完成/提交。
问题在于存储完成的表单提交。每个表单都可以并且会在表单元素的数量和组合方面有所不同,并且对于关系数据库,我的选择在一定程度上仅限于动态创建一个新表来保存每个表单的提交(似乎是一条不好的路径)或存储在 TEXT 列中以 JSON 格式提交的每个表单(失去 RDBMS 的所有有用查询能力)
我以前从未在生产项目中实际使用过 MongoDB,但我认为使用我的 MySQL 关系数据库存储由我的应用程序的某些用户创建的所有表单可能是个好主意,然后存储所有MongoDB 中的提交,每个文档都引用 MySQL 中表单的 UUID。
我能想到的第一个缺点是表单提交和 MySQL 中的表单之间没有参照完整性。如果我在 MySQL 中删除一个表单,则必须手动删除所有表单提交(如果我想复制“级联”效果)
我是否会将我所有表单的所有表单提交存储在单个 MongoDB 集合中作为单独的文档?任何意见是极大的赞赏。 :)
编辑 1 基于此处的文档:http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections
我现在正在考虑创建一个新集合来保存来自每个独特表单类型的所有提交。
编辑 2
经过仔细考虑和其他人的建议后,我决定放弃解决此问题的双数据库方法,转而使用我认为可以解决创建动态表单和保存表单提交的问题的关系数据库模式这样他们就可以轻松查询复杂的报告。
基本上,“表单”中的每条记录都代表用户构建的唯一表单。 'forms_fields' 有一个引用表单的外键和一个带有选项的枚举类型: 1.复选框 2. 文本字段 3.文本区域 4.选择 5.多选 6.日期
'forms_fields_options' 包含一个选择字段将具有的所有'选项'。 通过这三个表,用户可以创建自定义表单。
当其他用户填写并提交表单时,会在 forms_submissions 中创建一条记录。对于每个字段,将在“forms_submissions_fields”中创建一个引用表单提交和 forms_fields_id 的相应记录。最终表“forms_submissions_options_multiselect”本质上是一个连接表,用于指示用户选择了多选表单字段中的哪些选项。
【问题讨论】:
-
使用您提供的架构,对其中一个自定义列进行简单搜索的查询是什么样的?
标签: mysql mongodb normalization rdbms nosql