为“表单引擎”设计数据库

时间:2012-09-21 08:34:20

标签: database-design

我正在尝试创建一个基本的表单生成器。因此,用户可以在某种CMS系统中单击HTML表单。我还在为此进行数据库设计,我对复选框有疑问。

我的数据库设计如下所示:

字段

pk_field_id | field_type | field_name   | default_value
1           | textfield  | text1        | Some default value
2           | textfield  | text2        | NULL
3           | radio      | radio1       | NULL
4           | checkbox   | check1       | NULL

所以这基本上是我保存所选字段的方式。当我读到这个表时,我可以通过switch语句读取field_type值,所以我知道要渲染的字段类型。

但这不是全部。我还有一个带有“值”的表格,这些表格按照单选按钮可以有的组合元素。

fieldvalues:

fk_field_id | label    | value
3           | Radio 1  | radio1
3           | Radio 2  | radio2
4           | Check 1  | check1
4           | Check 2  | check2

所以现在,当我阅读表格fields时,我可以JOIN表格fieldvalues,这样我知道哪些选项属于radio以及checkbox是什么1}}。这一切似乎都很好。

现在是棘手的部分。生成表单时,我还需要一个位置来保存输入的值。 所以我的Form Engine会自动为此创建一个额外的表格。它为field_name表中的每个fields创建一列。因此,在这种情况下,动态创建的表如下所示:

myForm会

pk_form_id | text1 | text2 | radio1 | check1 | language_id

现在,当用户在生成的HTML表单中输入数据时,我可以轻松保存所有输入的数据。因为文本字段只需要一列。分组的单选按钮最终只提交一个值。但是,当选中两个或更多复选框时,一组复选框当然可以提交多个值。

现在我的问题是,如何将其保存到数据库?我不认为将多个值存储在一列中是一个好主意,由一个特定字符分隔。因为这也使得难以进行搜索。

我最初认为这是一个很好的方法,因为我可以通过简单的myform查询轻松地从SELECT ... WHERE表中提取一行。

所以无论如何,我不确定这是否是一个好的设置......我如何处理复选框可以提交的多个值?

有关于此的任何想法吗?

2 个答案:

答案 0 :(得分:1)

将值存储为XML / JSON将是最佳选择。根据您的RDBMS,db可以本机处理XML和/或您可以使用XPath查询doc。 Drupal大量使用这种类型的存储,它适用于它们。

答案 1 :(得分:0)

我认为你的问题是你没有考虑正确的检查控制。您需要将每个单选按钮或复选框视为自己的控件。

单选按钮组合在一起的事实是影响其行为的单选按钮的一个方面。每个单选按钮实际上都有一个值(checked = true,false)。您的控制值表应包含每个单选按钮(和复选框)的条目,就像它对每个文本框一样。

此信息应该在主控制表中,而不是为选项按钮及其值保留子表,而应扩展该控制表以提供某些机制来对这些控件进行分组。您可以拥有一个control_group表,其中包含来自fields的可选外键,或者您可能只是反规范化并在group-name表上有一个可选的fields列。