如何将用户生成的表单映射到数据库?

时间:2011-11-12 16:10:04

标签: forms database-design

我希望用户能够制作包含N个字段,文本,数字,电子邮件,组合等的表单。如何存储每个字段而不知道它们中有多少个? 我想到的第一种方法是将所有文本字段存储在一个表中,将所有电子邮件字段存储在另一个表中等等。然后,在表中,我将表单信息与其自己的ID存储在一起。 我如何在这个表单系统中解决可伸缩性问题?例如,有多个服务器共享表单。 我的设计足够好吗? 我需要存储什么来转换为使用XSLT的html?

1 个答案:

答案 0 :(得分:0)

两种解决方案:

  • 创建一个干净的,规范化的数据库结构(避免EAV Model
  • 将元数据(如XML等)存储在数据库中

<强> 1。溶液

表单

id | user_id | name
  • user_id:此表单的“所有者”
  • name:表单的名称,如“Registration”或其他

form_fields表

id | form_id | label | type | sorting | values | default 
  • form_id是表格表的外键
  • label是输入的标签,如“密码”
  • type是输入类型(如select,email,password,text),基于此可以处理显示/验证等。
  • 排序使您能够以表格
  • 排列字段
  • values - 预定义值示例是一个选择框,将其存储为元数据,如xml,json或其他任何内容,并在应用程序中解析它,您可以使用类型字段来确定您希望如何处理这些值
  • default - 默认值(可能是选择框中的选定值或文本输入的预定义文本)

如果有人填写表格:

filled_forms表

id | user_id | form_id
  • user_id:谁填写表单?
  • form_id:哪种形式?

<强> filled_form_values

id | filled_form_id | field_id | values
  • filled_form_id:fill_forms表的外键
  • field_id:表单的字段ID
  • values:输入的值,可以存储为JSON,XML等元数据(例如:允许多个选择的选择框),您可以加入表单和表单字段,这样您就可以获得字段的类型然后就可以处理了正确的价值

优点:

  • 数据库为您处理数据完整性
  • 规范化数据库架构

缺点:

  • 静态架构,检索字段的多个联接
  • 走向EAV-Model的方向
  • 无法使用XSLT进行直接转换

<强> 2。溶液

您只有两张桌子:

表单

id | user_id | name | metadata
  • user_id:表单所有者(外键)
  • name:表格名称(如注册等)
  • 元数据:您自己实现的表单描述(HTML,XML,JSON等),它正确描述了表单,为元素提供了ID等。

filled_forms表

id | form_id | user_id |值

  • form_id:表单的外键
  • user_id:填写表单
  • 的用户的外键
  • values:您填写的表单(HTML,XML,JSON等)的自我实现描述,描述输入并将其正确映射到字段

优点:

  • 非常灵活,没有EAV陷阱,结构简单
  • 使用XSLT进行直接转换

缺点:

  • 您必须通过自己的
  • 确保数据完整性