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

Forms 如何将用户生成的表单映射到数据库中?,forms,database-design,Forms,Database Design,我希望用户能够使用N个字段、文本、数字、电子邮件、组合等创建表单。如何存储每个字段而不知道其中有多少字段? 我想到的第一种方法是将所有文本字段存储在一个表中,将所有电子邮件字段存储在另一个表中,等等。然后,在一个表中,我使用自己的ID存储表单信息。 我如何在这个表单系统中解决可伸缩性问题?例如,有多个服务器共享表单。 我的设计够好吗? 我需要存储什么才能使用XSLT转换为html?两种解决方案: 创建干净、规范化的数据库结构(避免) 在数据库中存储元数据(如XML等) 1。解决方案: id

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

两种解决方案:

  • 创建干净、规范化的数据库结构(避免)
  • 在数据库中存储元数据(如XML等)
1。解决方案

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
表格

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
  • 用户id:此表单的“所有者”
  • 名称:表格的名称,如“注册”或其他名称
表单字段表

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
  • form_id是forms表的外键
  • 标签是输入的标签,如“密码”
  • 类型是输入类型(如选择、电子邮件、密码、文本),在此基础上,您可以处理显示/验证等
  • 排序使您能够在表单中排列字段
  • 值-预定义值示例是一个选择框,将其存储为xml、json等元数据,并在应用程序中对其进行解析,您可以使用类型字段确定如何处理这些值
  • 默认值-默认值(可能是选择框中的选定值或文本输入的预定义文本)
如果有人填写表格:

填写表格表

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
  • 用户id:谁填写了表格
  • 表格id:哪种表格
填写的表单值

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
  • 填充表单id:填充表单表的外键
  • 字段id:表单的字段id
  • 值:输入的值,可能存储为元数据,如JSON、XML(例如:允许多个选择的选择框)。您可以连接表单和表单字段,以便获得字段的类型,然后可以正确处理值
优点:

  • 数据库为您处理数据完整性
  • 规范化数据库模式
缺点:

  • 静态模式,用于检索字段的多个联接
  • 与EAV模型的方向一致
  • 不可能使用XSLT进行直接转换
2。解决方案

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
您只有两个表:

表格

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
  • 用户id:表单的所有者(外键)
  • 名称:表格名称(如注册等)
  • 元数据:您对表单的自我实现描述(HTML、XML、JSON等),它正确地描述了表单,为元素提供了ID等
填写表格表

id | user_id | name
id | form_id | label | type | sorting | values | default 
id | user_id | form_id
id | filled_form_id | field_id | values
id | user_id | name | metadata
id |表单| id |用户| id |值

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

  • 非常灵活,无EAV陷阱,结构简单
  • 可以使用XSLT进行直接转换
缺点:

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

我将使用第二种解决方案,另外,您认为哪种解决方案的资源密集度较低?确保数据完整性+更新元数据或使用第一个解决方案强调数据库?