2012-09-21 24 views
1

我想创建一个基本的表单生成器。因此,用户可以在某种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我可以JOINfieldvalues和方法,我知道哪些选项属于radio什么给checkbox。这一切似乎工作正常。

现在棘手的部分。当表单生成时,我还需要一个地方来保存输入的值。 所以我的Form Engine自动创建一个额外的表。它为fields表中的每个field_name创建一个列。因此,在这种情况下,动态创建的表看起来像这样:

myForm的

pk_form_id | text1 | text2 | radio1 | check1 | language_id 

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

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

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

因此,无论如何,我不知道这是否是一个好的设置...以及如何处理复选框可以提交的多个值?

对此有何想法?

+0

http://stackoverflow.com/a/5858666/1114171 –

+0

哇,它就像你正在创建一个数据库,在数据库中! –

回答

0

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

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

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

1

将值存储为XML/JSON将是一种可行的方式。根据您的RDBMS,数据库可以本地处理XML和/或您可以使用XPath查询文档。 Drupal大量使用这种类型的存储,并且对他们来说工作正常。