我正在为客户端做一个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来代替它