在我参与的几个 Web 应用程序项目中,客户要求能够创建自己的表单。问题出现在如何存储他们的表单定义,然后如何将用户输入的值存储到这些自定义表单中。
我已经看到它做了两种方式:
假设客户端只定义了多少个字段,以及与这些字段相关联的标签;我们可以得出一个涉及四个表的解决方案。
FormDefinition
,FormFieldDefinition
,FormInstances
,FormFieldValues
.FormDefinition
客户端对and进行更改FormFieldDefinition
,Web 应用程序使用该信息呈现 HTML Web 表单,网站访问者(最终用户)将在该表单上提交表单,其中FormInstances
创建新行并将值保存在FormFieldValues
桌子。行中的
FormDefinition
定义形式,即form definition ID = 2, form title = 'Car Registration Form'
。中的行FormFieldDefinition
定义表单中的字段FormDefinition
,即field definition ID = 7, field label = 'Car Model', field type = 'varchar(50)'
。Rows inFormInstance
是用户填写的每个表单的一个实例,即definition id = 2, date_entered = '2008-09-24'
. 中的行FormFieldValues
是用户的条目,即field definition = 7, value = 'Tiburon'
.不幸的是,这意味着其中的值列
FormFieldValues
必须是您的客户可能在 Web 表单中指定的最大可能大小的 char 类型......并且当表单定义更改时,管理旧数据变得不确定。但是用户条目是可查询的(我写了一个快速查询,列出了给定表单 id 的用户条目,这类似于另一个 pivot question)。使用四个表的替代方法是将表单定义和用户的表单条目序列化为 XML(或 YAML 或类似的东西)并将其存储为文本。好处是表格在数据库中是人类可读的。缺点是解析 XML 会产生更多的应用程序开销,并且从 SQL 的角度来看,数据库的可查询性会大大降低。
我真正的问题是,这个数据库模型叫什么?(所以我可以用谷歌搜索这个问题。)但我会选择一个答案:哪个是更好的实现,或者那里有更好的(或同样好的)实现?