我想存储大量已填写的政府表格,例如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
答案 0 :(得分:1)
虽然这样可行,但您的SQL会稍微尴尬并且非常不直观。您是否考虑过单独为每个表单创建数据模型,然后使用这些模型填充表单。预先看起来可能更有用,但数据捕获的开发可能会更简单。
答案 1 :(得分:0)
我会看看single table inheritance。
将每个字段建模为基类Field
,其子类为IntField
,BoolField
等。
Field
班级将有Name (string)
成员,IntField
将有IntValue (int)
,BoolField
将有BoolValue (bit)
等。
这要求您在Field
- 表中为每种可能的类型设置一列,这是一个空间开销,但另一方面它可以为您提供类型安全性。如果您建模为单表继承,您可以毫无问题地连接您喜欢的ER映射器。