我正在尝试创建一个基本的表单生成器。因此,用户可以在某种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
表中提取一行。
所以无论如何,我不确定这是否是一个好的设置......我如何处理复选框可以提交的多个值?
有关于此的任何想法吗?
答案 0 :(得分:1)
将值存储为XML / JSON将是最佳选择。根据您的RDBMS,db可以本机处理XML和/或您可以使用XPath查询doc。 Drupal大量使用这种类型的存储,它适用于它们。
答案 1 :(得分:0)
我认为你的问题是你没有考虑正确的检查控制。您需要将每个单选按钮或复选框视为自己的控件。
单选按钮组合在一起的事实是影响其行为的单选按钮的一个方面。每个单选按钮实际上都有一个值(checked = true,false)。您的控制值表应包含每个单选按钮(和复选框)的条目,就像它对每个文本框一样。
此信息应该在主控制表中,而不是为选项按钮及其值保留子表,而应扩展该控制表以提供某些机制来对这些控件进行分组。您可以拥有一个control_group
表,其中包含来自fields
的可选外键,或者您可能只是反规范化并在group-name
表上有一个可选的fields
列。