在PHP / MySQL中存储大量表单数据的最佳方法?

时间:2011-12-07 15:29:18

标签: php mysql codeigniter database-design serialization

我正在为客户端做一个网络应用程序,这是一个内部系统,让员工在开始之前填写大量表单。

当我收到表格时,有很多像25-30,我无法弄清楚如何在MySQL数据库中存储每个表格的数据。每个表单都有不同的数据和不同的选择。

最初我考虑使用单个表,然后将选择序列化为一列而不是一百列。我以前没有做过这么大的事情,想知道保存数据的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

您可以使用EAV商店,例如:

| form_name | employee_id | field_name | value |

它不是超级干净但是有点标准化,你将能够以一种理智的方式对它进行查询。如果您遇到表太大的问题,即使使用索引,您也可以将EAV存储分成多个表,可能是form_name。

答案 1 :(得分:0)

您可能至少需要三个表格:

CREATE TABLE form_fields (
 id INT NOT NULL AUTO_INCREMENT,
 form_name VARCHAR(50),
 field_name VARCHAR(20),
 PRIMARY KEY  (`id`),
 UNIQUE KEY `real_pk` (`formname`,`fieldname`)
);

CREATE TABLE forms_completed (
 id INT NOT NULL AUTO_INCREMENT,
 form_name VARCHAR(20),
 ... other info about this instance of the form, 
         e.g. submitted date, submitted by...
 PRIMARY KEY  (`id`),
 FOREIGN KEY (form_name) REFERENCES form_fields(form_name)
                  ON DELETE CASCADE
);

CREATE TABLE form_values (
 id INT NOT NULL AUTO_INCREMENT,
 form_instance IN NOT NULL,
 form_name VARCHAR(50), /* only required to force referential integrity */
 field_name VARCHAR(20),
 date_value DATETIME,
 int_value INT,
 float_value FLOAT,
 string_value VARCHAR(100),
 PRIMARY KEY  (`id`),
 FOREIGN KEY (form_instance) REFERENCES forms_completed(id)
                  ON DELETE CASCADE,
 FOREIGN KEY (form_name, field_name) 
      REFERENCES form_fields(form_name, field_name)
                  ON DELETE CASCADE
);

答案 2 :(得分:0)

如果您没有锁定MySQL,可以尝试使用MongoDB,因为它更适合像这样的任务。如果您被锁定,EAV可能就是您的选择。

答案 3 :(得分:-3)

如果您使用此数据来维护记录,则最好使用MS Excel。 或者您甚至可以尝试使用MS Access替代它。