存储政府表格

时间:2011-02-14 10:54:09

标签: sql

我想存储大量已填写的政府表格,例如Application for Federal Assistance。表格多种多样,每年都在变化。字段类型各不相同,可以是:boolean,string,date,int等。

存储这些表单以完全标准化数据的最佳方法是什么?

Àla:

form
+-----------------+-----------+------+-----+---------+----------------+
| Field           | Type      | Null | Key | Default | Extra          |
+-----------------+-----------+------+-----+---------+----------------+
| id              | int(11)   | NO   | PRI | NULL    | auto_increment |
| govt_identifier | char(40)  | YES  |     | NULL    |                |
| description     | char(100) | YES  |     | NULL    |                |
+-----------------+-----------+------+-----+---------+----------------+

filled_form (a form a person has actually filled out)
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| form_id   | int(11) | NO   |     | NULL    |                |
| person_id | int(11) | NO   |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+

text_field (a class of input; belongs to a form)
+---------+----------+------+-----+---------+----------------+
| Field   | Type     | Null | Key | Default | Extra          |
+---------+----------+------+-----+---------+----------------+
| id      | int(11)  | NO   | PRI | NULL    | auto_increment |
| name    | char(40) | YES  |     | NULL    |                |
| form_id | int(11)  | NO   |     | NULL    |                |
+---------+----------+------+-----+---------+----------------+

text_value (a particular input record; belongs to a class and filled_form)
+----------------+---------+------+-----+---------+----------------+
| Field          | Type    | Null | Key | Default | Extra          |
+----------------+---------+------+-----+---------+----------------+
| id             | int(11) | NO   | PRI | NULL    | auto_increment |
| value          | text    | YES  |     | NULL    |                |
| text_field_id  | int(11) | NO   |     | NULL    |                |
| filled_form_id | int(11) | NO   |     | NULL    |                |
+----------------+---------+------+-----+---------+----------------+

... continue for all input types

2 个答案:

答案 0 :(得分:1)

虽然这样可行,但您的SQL会稍微尴尬并且非常不直观。您是否考虑过单独为每个表单创建数据模型,然后使用这些模型填充表单。预先看起来可能更有用,但数据捕获的开发可能会更简单。

答案 1 :(得分:0)

我会看看single table inheritance。 将每个字段建模为基类Field,其子类为IntFieldBoolField等。

Field班级将有Name (string)成员,IntField将有IntValue (int)BoolField将有BoolValue (bit)等。

这要求您在Field - 表中为每种可能的类型设置一列,这是一个空间开销,但另一方面它可以为您提供类型安全性。如果您建模为单表继承,您可以毫无问题地连接您喜欢的ER映射器。