2015-06-07 98 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

我真的很喜歡這種方法。我想我第一次讀它時並沒有想到。因此,此表中的每條記錄都會捕獲一個帶有時間戳和相關值的字段。這意味着表單和頁面可能會以一百多種不同的方式進行更改,您不會在意一點,因爲您可以捕獲所有內容。輝煌。非常感謝! –