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


Best way to store large amounts of form data in PHP/MySQL?

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

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

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

您可以使用EAV存储,如:

| form_name | employee_id | field_name | value |

它不是超级干净,但它是有点规范化,你将能够以一种合理的方式查询它。如果遇到表太大的问题,即使有索引,也可以通过form_name将EAV存储拆分为多个表。

您可能需要至少三个表:

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
);

如果您没有锁定MySQL,您可以尝试使用MongoDB,因为它更适合这样的任务。

如果你正在使用这些数据来维护记录,使用MS Excel是一个更好的主意。或者你也可以用MS Access来代替它