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

时间:2012-09-06 12:35:42

标签: sql forms database-design normalization entity-attribute-value

我想构建一个与wufoo非常相似的在线表单构建器,允许用户创建和发布自己的Web表单。每个提交都应保存到数据库,用户以后可以在其中检索提交内容。

因为这些形式是动态的,即。用户可以完全控制表单字段的数量和类型,我试图想出一个可靠的数据库设计来存储这些信息。

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

一个基本表格,用于保存每个表单id,url等。

然后我会有一个表格表格,其中包含对基本表格和字段类型的引用,此表格还可以包含要在每个字段上完成的自定义验证。

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

2 个答案:

答案 0 :(得分:1)

  

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

我认为您正在寻找Entity–attribute–value数据库模型,其中包括:

  

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

     

通常,表至少有三列:entity,attribute和   值。但是,如果只有一个相关实体,例如一张桌子   对于应用程序配置或选项设置,实体列   可以被排除在外。

将此页面视为开头:

我使用标记重新提出了您的问题,您可以在其中浏览与您的案例相关的大量话题。

答案 1 :(得分:0)

正如Mahmoud Gamal所写,你描述的模型是“实体/属性/价值”;正如Borys所写,这个模型存在许多已知问题。

作为替代方案,您可以考虑将表单条目存储在“文档”中 - 例如XML或JSON - 在关系模型中。

例如,您可能有一个表格:

FORM_SUBMISSION
--------------------
Submission_ID (pk)
Client_ID (fk to clients table)
Submission_date
SubmissionDocument

我正在使用“client”来表示创建表单的用户;要检索给定客户端的所有提交,请在client_id上使用where子句。

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