我正在爲客戶做一個網絡應用程序,這是一個讓員工在開始之前填寫大量表單的內部系統。在PHP/MySQL中存儲大量表單數據的最佳方法?
當我收到表格時,有很多這樣的表格,比如25-30,而且我很難弄清楚如何在MySQL數據庫中存儲每個表格的數據。每個表格都有不同的數據和不同的選擇。
最初我在考慮製作一個表格,然後將選擇序列化到列中而不是一百列。我之前沒有做過這麼大的事情,想知道保存數據的最好方法是什麼?
我正在爲客戶做一個網絡應用程序,這是一個讓員工在開始之前填寫大量表單的內部系統。在PHP/MySQL中存儲大量表單數據的最佳方法?
當我收到表格時,有很多這樣的表格,比如25-30,而且我很難弄清楚如何在MySQL數據庫中存儲每個表格的數據。每個表格都有不同的數據和不同的選擇。
最初我在考慮製作一個表格,然後將選擇序列化到列中而不是一百列。我之前沒有做過這麼大的事情,想知道保存數據的最好方法是什麼?
您可以使用EAV店,是這樣的:
| form_name | employee_id | field_name | value |
這不是超級乾淨,但它是還挺標準化,你將能夠以健全的方式就可以查詢。如果遇到表太大的問題,即使使用索引,也可以通過form_name將EAV存儲拆分爲多個表。
你可能至少需要3個表:
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中這樣做,因爲它更適合於像這樣的任務。如果你被鎖定,EAV可能是要走的路。
是否必須是MySQL?你可以使用NoSQL數據庫,比如MongoDB,它是無模式的... http://blog.mongodb.org/post/119945109/why-schemaless – Flukey
就在一個標準的Linux主機上,我正在用Codeigniter做 - 而不是相信我將有權限來安裝MongoDB的 – benpalmer
啊,這是一個恥辱:-)將使你的生活輕鬆了許多:-) – Flukey