在我参与的几个Web应用程序项目中,客户端要求能够创建自己的表单。问题出现在如何存储表单定义,以及如何将用户输入的值存储到这些自定义表单中。

我看到它有两种方式:

  1. 假设客户端仅定义了多少个字段,以及与这些字段关联的标签;我们可以找到一个涉及四个表的解决方案。 FormDefinition FormFieldDefinition FormInstances <代码> FormFieldValues 即可。客户端对 FormDefinition FormFieldDefinition 进行更改,Web应用程序使用该信息呈现HTML Web表单,网站访问者(最终用户)将在该表单上提交表单,其中创建 FormInstances 中的新行,并将值保存在 FormFieldValues 表中。

      

    FormDefinition 中的行定义表单,即表单定义ID = 2,表单title ='Car Registration Form' FormFieldDefinition 中的行定义 FormDefinition 中表单的字段,即字段定义ID = 7,字段标签='Car Model', field type ='varchar(50)' FormInstance 中的行是用户填写的每个表单的实例,即 definition id = 2,date_entered ='2008-09-24' FormFieldValues 中的行是用户的条目,即 field definition = 7,value ='Tiburon'

    不幸的是,这意味着 FormFieldValues 中的value列必须是客户端可能在Web表单中指定的最大可能大小的char类型...当表单定义发生更改时,管理旧数据变得虚弱。但用户条目是可查询的(我写了一个快速查询,列出了给定表单ID的用户条目,这是类似于另一个支点问题。)

  2. 使用四个表的另一种方法是将表单定义和用户表单条目序列化为XML(或YAML或类似的东西)并将其存储为文本。好处是表单在数据库中是人类可读的。缺点是解析XML会有更多的应用程序开销,从SQL的角度来看,数据库的可查询性要低得多。

  3. 我真正的问题是,这个数据库模型叫什么? (所以我可以谷歌这个问题。)但我会回答:哪个是更好的实现,还是有更好的(或同样好的)实现?

有帮助吗?

解决方案

您所描述的内容通常称为“实体 - 属性 - 值”,有时被描述为“混合数据和元数据”。也就是说,属性(字段)的名称存储为字符串(数据)。

这会导致一系列复杂的问题,例如确保每个表单实例包含相同的字段集,或者确保填写必填字段(相当于传统表中的NOT NULL)。

您问过如何使用关系数据库做到最好。在关系数据库中,您应该使用元数据进行元数据。在这种情况下,它意味着为每个表单创建新表,并使用列表单字段。因此,表单定义只是表元数据,一个表单实例是该表中的一行。如果您支持具有多值答案的表单(例如复选框),则还需要从属表。

这可能看起来很昂贵或难以扩展。可能是真的。因此,关系数据库可能不是这项工作的最佳工具。你提到了XML或YAML的可能性;基本上是某种结构化的文件格式,你可以定义ad hoc。您应该为每个客户的表单定义一个DTD,这样可以验证收集的每个表单。

编辑:如果您真的需要在应用程序中使用EAV的灵活性,那很好,通常情况下有理由违反规则。只需要了解它所需的额外工作,并在开发计划中进行规划,并在扩展服务器以处理负载时进行规划。另请参阅另一个关于EAV的我的答案在StackOverflow上。

其他提示

  

这个数据库模型叫什么?

不确定实际调用它的是什么,但它与动态生成调查时使用的过程相同。如果您查找用于生成调查应用程序的任何源,您将找到相同的通用数据库架构以及类似的方法。

另请参阅表单构建器网站,例如 http://wufoo.com/ http://frevvo.com/ 了解用户界面的想法(如果你是基于网络的那样)。

还有第三个选项,您可以根据需要创建表并添加列。这取决于创建了多少表单,但数据库可以轻松处理很多表。因此,如果用户想要添加表单'Car Registration Form',则添加表'CarRegistrationForm'。对于表单上他们想要的每个字段,您可以让他们在日期,整数和文本等一些基本类型之间进行选择。选择文本后,他们必须从选择列表中输入最大长度,如果该字段应为varchar或clob,则会为您提供信息。

这适用于SQL Server,您可以在其中轻松添加和删除列。对于DB2而言,这可能是一个问题,因为未实现drop列。对于mysql我不确定。

您仍然需要在两个单独的表格中注册表单及其中的字段。

您可能需要实体 - 关系模型

确实有GUI工具可以从这些模型中交互式地创建模式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top