当存在未知的数据量时,将表单数据放入数据库的最佳方法是什么?

时间:2010-08-05 07:20:43

标签: html database forms

我有一个非常大的表单,包括单选按钮/复选框以及文本输入。由于复选框的性质,如果他们发布表单而不检查它,它不会在POST数据中发送。这使我对如何处理它感到困惑。

我最初使用每个字段的标准“列”启动了我的数据库。例如:

id | userid | firstname | lastname | middlename | phonenumber | mobilenumber |

当我最终拥有超过30列时,很快就改变了。这种形式是巨大的。我已经决定使用'EAV架构'给我的表只有4行。它现在看起来像这样:

id | userid | name      | value
---+--------+-----------+------
 1 |    1   | firstname | steve
---+--------+-----------+------
 2 |    1   | lastname  | blah

这似乎是一种更好的方法。

所以我的问题是,当我不完全确定它的内容时,我应该如何处理数据库?如果我有20个复选框(每个都有自己的名字),我应该手动检查每个复选框是否已提交,如果没有,则设置'null'值?

我应该从表中清空用户ID的所有行,并将其替换为所有新数据吗?

这样做的有效方法是什么?

3 个答案:

答案 0 :(得分:1)

在这种情况下,EAV是一种反模式。为了检索一组数据,你最终会得到非常复杂的逻辑。

您的第一种方法对其他人来说更易于维护和理解。

当涉及一个布尔值,例如一个复选框值时,我会在数据库中使用一个位/布尔字段,其中一个复选标记是真的,而你没有得到它的事实将是变得虚伪。

同样的事情代表EAV架构 - 将它们全部保存在数据库中,只需将值标记为true或false,具体取决于发布的内容。

答案 1 :(得分:0)

您应首先解析输入,并确定每个项目的正确值。然后你获取数据并放入数据库。

代码不应该依赖于表单中字段的存在来确定要放入数据库的字段。表单可以很容易地被操作,因此它可以用来更改表格中的任何字段,而不仅仅是与表格中放置的字段相对应的字段。

如果您有大量类似字段或动态字段集,则EAV架构很好。也许您应该以常规方式存储文本数据,并将复选框中的值存储在单独的表中。

答案 2 :(得分:0)

也许有点偏离主题,但要解决复选框功能,请在复选框和值之前添加一个具有相同名称的隐藏输入 - 零(或表示“未设置”的值):

<input type="hidden" name="blah" value="0">
<input type="checkbox" name="blah" value="1">

这样,如果未选中该复选框,您的帖子中仍会显示0的值 - 但如果选中该复选框,则会获得1,因为最后一个同名字段为POST'ed。