在数据库上生成动态字段并为表单生成动态字段

时间:2014-11-06 07:52:22

标签: sql sql-server database database-design

最近我看到了一个网站应用程序,有一个有趣的HTML表单引起了我的注意!在网站管理员系统中,您可以定义一个表格,如就业表格,您可以在表单中定义所需的字段。

例如,您可能希望生日,姓名,姓氏和性别字段的表单生日,姓名和姓氏类型为Textbox,性别类型为Checkbox,因此您可以生成优化的表单和另一个人也可以创建她/他的优化形式。

之后,任何人都可以在网站客户页面填写您的表单,您可以在经理网站中查看所有填写的表格。所以对我来说有一个很大的问题,网站数据库如何设计它可以动态地改变字段?!在第一个视图中,我认为数据库中有一个列,它的类型是XML,它可以在单列中生成基于XML的任何表单。但我认为这不是一个好方法,因为我们将拥有许多类似数据的拥抱数据库(XML文本大多相似),那么有更好的方法吗?

注意:数据库在sqlserver2012上,我问网站管理员你是怎么做到的,他告诉我这种类型的设计被称为“属性引擎”,因为我搜索了它但是我没有找到任何有用的信息!那么你的想法是什么?

1 个答案:

答案 0 :(得分:2)

我认为您不一定需要XML来实现这样的系统,这是选择的问题。它可以像下面这样实现:

enter image description here

这意味着:只需在数据库模型的META方向上向前迈出一步。

但是当然你必须围绕这样一个不简单的数据库模型实现应用程序。当然已经存在很多这方面的实现。


你也可以查看这个question - 这里的设计有点简单,不允许在各种表格中重复使用字段 - 这可能没问题,甚至更好,取决于你计划实施的内容。因此,Form和Field表之间会有1:N的关系。

enter image description here

所以你的数据库字段是这样的:

Form
-----
  FormID (PK)
  FormName
  UserId (FK to users)
 (other fields)

FormField
-------------
  FormFieldId (PK)
  FormID (FK to form)
  FieldTypeId (FK to FieldType)
  FieldName  (or Caption ...)
  (other fields)

FieldType
-------------
  id (PK)
  name

FilledForm
-------------------
  FilledFormId (PK)
   +IPAddress, data about who filled the form...


FilledFormField
-------------------
  FilledFormFieldId (PK)
  FilledFormId (FK)
  FormFieldId (FK)
  Value 

如果您不需要跟踪填写表单的人的信息,您也可以从模型中删除FilledForm表。

在这样的数据库设计中,不要忘记创建正确的主键和索引。