2013-07-29 59 views
6

我必須將文章等數據存儲到mysql數據庫中,如果文章被修改,我還必須保存舊版本以便恢復它。我在這個主題上發現了一些類似的問題和帖子,但我不確定,哪種解決方案最能解決問題。mysql數據版本控制系統的最佳做法

這裏是爲了更好地理解基本表 「文章」:

文章(ID,姓名,文本)

對於我來說,這是你的兩種不同的方法:

方法1

將數據和文章的每個版本存儲在表格「文章」中,並添加「版本」和「狀態」列。在版本中,我存儲文章的增加版本號。主動文章獲得了「狀態」 1和其他人的「身份」 2.

Pro的:

  • 只需要一個表

  • 新版本的插件新的數據,只有老的「狀態」 -column的更新

反對的

  • 非常大的表(也許慢查詢???)

方法2

,添加字段「版本」,以「公司章程」,並僅在活動數據存儲到表「文章」。舊版本的數據存儲/移動到新表「articles_versioned」。

Pro的:

  • 只有實際有效數據表中的 「文章」

反對的表

  • Dublication

所以。我忘記了一個好的方法嗎?如何處理其他表格中的相關數據(如圖像等)?

+1

這通常稱爲「更改數據捕獲」(CDC)。谷歌爲它:http://www.google.com/search?aq = f&gcx = w&sourceid = chrome&ie = UTF-8&q = mysql + change + data + capture&safe = active – duffymo

+0

你甚至不需要更新以前的狀態,只需選擇該特定文章的最高ID – Anigel

+0

狀態是如果我想回到以前的版本 – bernhardh

回答

3

我的選擇是方法2的變體。粗體表示主鍵中的字段。

  • 您在表articles_versionedID時間戳,名稱,文本)
  • 你的第二個表是articles插入每篇文章(ID,時間戳,[名字,文字])。請注意時間戳不是主要的;命名和文本可以被複制,或者您可以使用與articles_versioned連接(這將是快速的,因爲ID和時間戳是articles_versioned主鍵)
  • articles_versioned對插入的觸發器,是以剛插入的行並複製它articles
  • 要恢復文章的特定版本,請修改articles表。

這種方法的優點是:

  1. 您免費獲得您的表中的另一信息(文章的日期和時間),你可能需要無論如何
  2. 你不需要查詢數據庫以獲取當前日期。如果你使用版本,你必須。
  3. 您的代碼不必將文章插入兩個表格中。您只需插入articles_versioned並從articles中讀取,db在您通過觸發器插入數據時負責遷移數據,避免了任何一致性問題。

反對的

  1. 在大量併發環境中,兩個版本可以在同樣的時間插入,所以他們中的一個可能會失敗。插入用戶編寫的文章時,這應該不成問題(這些日期時間戳的精度極不可能)。如果您沒有在INSERT聲明中指定時間戳記,而是將日期時間字段設置爲將當前時間作爲默認值,則可以完全避免此問題。

要回答你的問題的其餘部分。只要您添加狀態索引,方法1不會導致更長的查詢。這隻有在你傾向於每篇文章有許多不同版本時纔有意義;只要你平均每篇文章有兩個版本或者更少,索引只會讓你放慢速度,而方法2無論如何都不會明顯更快(儘管我仍然推薦我的方法,因爲它簡單地編寫代碼,因爲恢復版本確實不需要兩行的切換狀態)。

相關資源,如圖片,應遵循相似的版本。我假設你將它們保存在文件系統上;不要用真實姓名保存它們,請使用表格(ID,image_name)爲每個圖像分配一個ID,然後將圖像保存爲-id-.jpg。 image_name字段將使您能夠知道原始文件名是什麼(如果你關心的話)。這樣,您可以使用與版本文章相同的方式版本化圖像,並且在文章中您可以使用類似<img src="-id-.jpg">的內容,您知道這些內容將永遠保持可用狀態。

+0

對不起,這個答案有點晚,但可能對其他人有用。 – p91paul

+0

去考古學鑼? – Strawberry

+1

來吧,我在尋找別的東西的時候遇到了這個問題,並且在注意到問題日期之前我開始回答:)。我認爲它仍然可以是相關的。 – p91paul