2015-06-07 34 views
0

致力于设计数据库以存储和跟踪Web表单内容的历史记录。通常这不会是一个问题。天真的实现是一个history表,记录表单字段内容以及时间戳。如何设计一个数据库来表示结构变化的数据?

以下是问题:此表单可能随时间而改变。字段可能会被重命名,添加或删除。

如何模拟并确保整个历史记录中的数据完整性。

我现在的想法是,history表可能只有两个字段:timestampdata。并且,在这种情况下,data将是与拍摄快照时表单域及其数据对应的JSON字符串。这意味着软件可以随时显示表格的回滚版本,无论结构如何变化。

什么可能是其他方法来表示这在数据库中?

使用Python/Django和MySQL,这可能不相关。

EDIT 1:

澄清。想象一下,想要在不受控制的网站上记录表格的历史记录。这是关于创建一个数据库来存储和记录该页面的历史记录。认为Git是一个页面,其表格和数据每年或每两年可以在结构和内容上发生变化。

编辑2:

一个选择是创建,由此可以通过使用存储在任何给定时间内各种类型的表单字段中,然后一个form_contents表来描述的形式的复杂的表结构或form_history表格最终将它们粘合在一起,可以记录随着时间​​变化的结构的历史记录。我可以看到这可能变得非常复杂。

+0

在你目前的情况下,你可以将表单域的所有值存储为字符串/文本吗? – sadaf2605

+0

是的。我必须存储其他一些东西。因此使用JSON的想法。换句话说,我可能想要描述每个字段的内容或数据类型的性质。 –

回答

3

如果我理解正确,我可能会做这样的事情:

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  | ... | 
| .. | ................... | ... | ............... | ... | .......... | ... | 
|----|---------------------|-----|-----------------|-----|------------|-----| 

这个非常简单的例子,数据显示只有两个形式(usernamepassword)上的字段。 1日他们都有一个maxlength为10,但在8日他们的maxlength值增加到32,并且两个新的字段被添加到表格中:fnamelname

+0

对,这将允许你随着时间的推移拍摄各个领域的快照。现在,设想一年后'field_value'和'field_lang'不再使用,并且引入了五个新的字段。问题在于如何建模,即使面对不断变化的领域,也可以保持这个特定页面的历史。我应该能够回滚到任何日期/时间,并获取表示该时间点的形式以及各个字段包含的内容的数据。 –

+0

@ martin's - 上面的列描述了表单上的**单个**字段。我上面建议的列只是'INPUT'标记的有效属性(我将离开'SELECT'标记的表设计作为读者的练习)。你的软件会每隔X天拍一张表格的快照,并且表格上的每一个字段都会在你的表格中有一行,并且都有相同的'datetime'标记。 –

+0

我真的很喜欢这种方法。我想我第一次读它时并没有想到。因此,此表中的每条记录都会捕获一个带有时间戳和相关值的字段。这意味着表单和页面可能会以一百多种不同的方式进行更改,您不会在意一点,因为您可以捕获所有内容。辉煌。非常感谢! –