正在设计一个数据库来存储和跟踪web表单内容的历史。正常情况下,这不会是一个问题。幼稚的实现是一个history
表,它记录表单字段的内容以及时间戳。
问题是:这个表单可能会随着时间的推移而改变。可以重命名、添加或删除字段。
如何建立模型并确保整个历史记录的数据完整性。
我现在的想法是,history
表可以完成只有两个字段:timestamp
和data
。在本例中,data
将是一个JSON字符串,对应于拍摄快照时的表单字段及其数据。这意味着无论结构如何变化,软件都可以在任何时候显示回滚版本的表单。
在数据库中有什么其他的方法来表示这个?
使用Python/Django和MySQL,可能不相关。
编辑1:
澄清。想象一下,想要在一个你无法控制的网站上记录一个表单的历史。它是关于创建一个数据库来存储和记录该页面的历史。试想一下,如果一个页面的表单和数据每隔一两年就会在结构和内容上发生变化,那就使用Git吧。
编辑2:
一种选择是创建一个复杂的表结构,这样一个表单可以通过使用一个表来描述,这个表存储在任何给定时间可用的各种类型的表单字段,然后form_contents
或form_history
表最终将它们粘合到一个结构中,该结构可以记录表单随时间变化的历史。
如果我理解正确的话,我可能会这样做:
CREATE TABLE IF NOT EXISTS `form_history` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`when` datetime NOT NULL,
`field_accept` varchar(255) DEFAULT NULL,
`field_accesskey` varchar(255) DEFAULT NULL,
`field_alt` varchar(255) DEFAULT NULL,
`field_autocomplete` varchar(255) DEFAULT NULL,
`field_autofocus` varchar(255) DEFAULT NULL,
`field_checked` varchar(255) DEFAULT NULL,
`field_class` varchar(255) DEFAULT NULL,
`field_contenteditable` varchar(255) DEFAULT NULL,
`field_contextmenu` varchar(255) DEFAULT NULL,
`field_data` text DEFAULT NULL,
`field_dir` varchar(255) DEFAULT NULL,
`field_disabled` varchar(255) DEFAULT NULL,
`field_draggable` varchar(255) DEFAULT NULL,
`field_dropzone` varchar(255) DEFAULT NULL,
`field_form` varchar(255) DEFAULT NULL,
`field_formaction` varchar(255) DEFAULT NULL,
`field_formtarget` varchar(255) DEFAULT NULL,
`field_height` int unsigned DEFAULT NULL,
`field_hidden` varchar(255) DEFAULT NULL,
`field_id` varchar(255) DEFAULT NULL,
`field_lang` varchar(255) DEFAULT NULL,
`field_list` varchar(255) DEFAULT NULL,
`field_max` varchar(255) DEFAULT NULL,
`field_maxlength` int unsigned DEFAULT NULL,
`field_min` varchar(255) DEFAULT NULL,
`field_multiple` varchar(255) DEFAULT NULL,
`field_name` varchar(255) DEFAULT NULL,
`field_pattern` varchar(255) DEFAULT NULL,
`field_placeholder` varchar(255) DEFAULT NULL,
`field_readonly` varchar(255) DEFAULT NULL,
`field_required` varchar(255) DEFAULT NULL,
`field_size` int unsigned DEFAULT NULL,
`field_spellcheck` varchar(255) DEFAULT NULL,
`field_src` varchar(255) DEFAULT NULL,
`field_step` int unsigned DEFAULT NULL,
`field_style` varchar(255) DEFAULT NULL,
`field_tabindex` int unsigned DEFAULT NULL,
`field_title` varchar(255) DEFAULT NULL,
`field_translate` varchar(255) DEFAULT NULL,
`field_type` varchar(255) DEFAULT NULL,
`field_value` varchar(255) DEFAULT NULL,
`field_width` int unsigned DEFAULT NULL,
PRIMARY KEY (`id`), KEY (`when`)
) ENGINE=InnoDB COMMENT='Field definitions';
你也可以为事件属性添加列,如果这对你很重要的话。
下面是一些示例数据:
|----|---------------------|-----|-----------------|-----|------------|-----|
| id | when | ... | field_maxlength | ... | field_name | ... |
|----|---------------------|-----|-----------------|-----|------------|-----|
| 1 | 2015-06-01 00:00:01 | ... | 10 | ... | username | ... |
| 2 | 2015-06-01 00:00:01 | ... | 10 | ... | password | ... |
| .. | ................... | ... | ............... | ... | .......... | ... |
| 17 | 2015-06-08 00:00:01 | ... | 32 | ... | username | ... |
| 18 | 2015-06-08 00:00:01 | ... | 32 | ... | password | ... |
| 19 | 2015-06-08 00:00:01 | ... | 25 | ... | fname | ... |
| 20 | 2015-06-08 00:00:01 | ... | 25 | ... | lname | ... |
| .. | ................... | ... | ............... | ... | .......... | ... |
|----|---------------------|-----|-----------------|-----|------------|-----|
这个非常简单的示例数据只显示了表单上的两个字段(username
和password
)。在第1天,它们的maxlength
都是10,但在第8天,它们的maxlength
值增加到32,并且在表单中添加了两个新字段:fname
和lname
。