在SQL中存储用户定义数据的正确方法

在SQL中存储用户定义数据的正确方法,sql,forms,database-design,normalization,entity-attribute-value,Sql,Forms,Database Design,Normalization,Entity Attribute Value,我想构建一个类似wufoo的在线表单生成器,允许用户创建和发布自己的web表单。每次提交都应保存到数据库中,用户可在该数据库中检索提交 由于这些表单将是动态的,即用户可以完全控制表单字段的数量和类型,因此我正在考虑一种可靠的数据库设计来存储这些信息 我将有一个表字段类型,其中包含用户可用的每种类型的字段,即textfield、emailfield等 一个baseform表,它将保存每个表单id、url等 然后,我将有一个表formfields,其中包含对baseform和fieldtype的引用

我想构建一个类似wufoo的在线表单生成器,允许用户创建和发布自己的web表单。每次提交都应保存到数据库中,用户可在该数据库中检索提交

由于这些表单将是动态的,即用户可以完全控制表单字段的数量和类型,因此我正在考虑一种可靠的数据库设计来存储这些信息

我将有一个表字段类型,其中包含用户可用的每种类型的字段,即textfield、emailfield等

一个baseform表,它将保存每个表单id、url等

然后,我将有一个表formfields,其中包含对baseform和fieldtype的引用,该表还可以包括对每个字段进行的自定义验证

这个设计作为基础结构好吗?我想在应用程序中添加新类型的字段很容易,但是我不知道潜在的缺点是什么,因为我离sql专家还很远

在SQL中存储用户定义的数据

我认为您正在寻找以下数据库模型:

基本思想是存储属性及其对应的值, 作为单个表中的行

通常,该表至少有三列:实体、属性和属性 价值但是如果只有一个相关实体,例如表 对于应用程序配置或选项设置,实体列 可以排除

请参阅以下页面作为开始:

  • (pdf)

  • (pdf)

我用标签重新标记了您的问题,在标签中,您可以浏览许多与您的案例相关的线程

在SQL中存储用户定义的数据

我认为您正在寻找以下数据库模型:

基本思想是存储属性及其对应的值, 作为单个表中的行

通常,该表至少有三列:实体、属性和属性 价值但是如果只有一个相关实体,例如表 对于应用程序配置或选项设置,实体列 可以排除

请参阅以下页面作为开始:

  • (pdf)

  • (pdf)


我用标签重新标记了您的问题,在标签中,您可以浏览许多与您的案例相关的线程

正如马哈茂德·贾马尔(Mahmoud Gamal)所写,您描述的模型是“实体/属性/价值”;正如Borys所写,这个模型存在许多已知的问题

作为替代,您可以考虑将表单条目存储在关系模型中的“文档”中(例如XML或JSON)。p> 例如,您可能有一个表,其行为:

FORM_SUBMISSION
--------------------
Submission_ID (pk)
Client_ID (fk to clients table)
Submission_date
SubmissionDocument
我使用“客户端”来表示创建表单的用户;要检索给定客户端的所有提交,请在客户端id上使用where子句


该模型使得针对表单提交运行SQL查询变得更加困难(尽管在EAV中,当超出非常简单的查询时,这也变得困难),但它极大地简化了持久性解决方案

正如马哈茂德·贾马尔(Mahmoud Gamal)所写,您描述的模型是“实体/属性/价值”;正如Borys所写,这个模型存在许多已知的问题

作为替代,您可以考虑将表单条目存储在关系模型中的“文档”中(例如XML或JSON)。p> 例如,您可能有一个表,其行为:

FORM_SUBMISSION
--------------------
Submission_ID (pk)
Client_ID (fk to clients table)
Submission_date
SubmissionDocument
我使用“客户端”来表示创建表单的用户;要检索给定客户端的所有提交,请在客户端id上使用where子句


该模型使得针对表单提交运行SQL查询变得更加困难(尽管在EAV中,当超出非常简单的查询时,这也变得困难),但它极大地简化了持久性解决方案

非常感谢您的回答实体属性值正是我要寻找的模型。EAV是众所周知的classis反模式。。。您选择了错误的路径。@Borys-您是对的,但是OP正在寻找一种方法来
完全控制表单字段的数量和类型。如何让用户能够使用规范化的数据库模型创建表单的字段和表单的类型,而您不知道每个字段将具有哪些属性?它是动态的,您无法判断每个表单的列。非常感谢您的回答。实体属性值正是我所寻找的模型。EAV是众所周知的classis反模式。。。您选择了错误的路径。@Borys-您是对的,但是OP正在寻找一种方法来
完全控制表单字段的数量和类型。如何让用户能够使用规范化的数据库模型创建表单的字段和表单的类型,而您不知道每个字段将具有哪些属性?它是动态的,你无法判断每个表单的列。谢谢你的回答,内维尔。谢谢你的回答,内维尔。