4

我開始一個項目,爲我們的軟件(.NET 3.5/SQL Server 2008)創建「對象版本控制」功能,基本上它需要這樣做:尋找在我們的應用程序中實現版本控制功能的建議

  • 用戶正在尋找一個客戶
    • 姓 「史密斯 - 約翰遜
    • 個2地址(保存在不同的表)
    • 1產物購買
    • 1名僱員接觸(保存在不同的表)
    • 200郵件(保存在不同的表)
  • 用戶點擊「查看過去狀態」按鈕,並選擇「2009年9月25日15:00」,其中顯示同一客戶的單獨視圖:
    • 姓 「史密斯」(自然後名已經改變)
    • 1地址(因爲隨後加入的地址)
    • 1產物購買(但它是不同以上,因爲他買了這個,以後又回來了,買了一個新的)
    • 2員工聯繫(因爲其中一個已被刪除)
    • 10郵件

在考慮一般的若干問題的問題上來:

  • 在什麼水平應該改變記錄,例如在的數據庫水平(日誌中每個表的每個屬性的每一個變化)或對象級別(序列化和存儲每一個物體和後變更後的相關性)
  • 怎麼會結構的變化的表被處理,例如如果「LastName」列更改爲「Surname」,那麼如何跟蹤列中的數據全部屬於同一列(因此版本服務不會報告「該客戶在9月25日沒有姓)」,而是知道的姓氏看,在.NET/SQL Server 2008的區域
  • 什麼支撐技術存在可能支持這項工作,如我期待到SQL Server的Change Tracking功能2008
  • 存在什麼樣的模式進行版本控制,例如我正在考慮Command Pattern,它可用於在應用程序中創建撤消功能。
  • 此版本的服務確實需要執行回滾而不是。它只需要能夠顯示對象的狀態依賴關係。

在軟件中實現版本控制功能的經驗是什麼?你有什麼建議?

+0

如何使用無模式數據庫結構來處理這個問題呢?我認爲你可以保存以前版本的索引,並且這種方式的表結構可以非常動態?有趣的問題。 – thismat 2009-11-06 14:12:43

回答

1

幾年前,我設計了一個系統版本的對象,使他們能夠在不同的環境(開發,分期,QA,生產)

我用手卷AOP方法在數據庫之間的複製時間。 Spring.NET或其他一些支持AOP的IoC框架今天會更好。對對象屬性的每次修改都作爲「更改」存儲在集中式數據庫中。每個更改都有一個版本號。我們使用Change(s)來記錄針對一個數據庫中的對象所採取的操作,並在目標中重播它們,從而有效地複製這些更改。

如果您使用的是ORM,那麼您應該可以更改數據庫中的列名稱,而無需擔心屬性名稱,如果使用這種解決方案。如果您更改屬性名稱,則可以使用新名稱更新更改記錄。

其中一種方法,但它對我們很有效,我認爲這對您的情況可能是一個好的開始。

2

我已經使用過類似功能的軟件。

而不是在數據庫中更新數據,每個更改都插入爲新記錄。數據庫中的每一行都有一個開始日期和一個結束日期。

最新的記錄是沒有結束日期的記錄。從那裏,您可以在任何給定日期查詢數據的狀態,只需搜索當時處於活動狀態的記錄即可。

存儲的明顯不足之處在於,你必須抽象數據層的某些方面,以使歷史追蹤對所有調用它的人都透明。

+0

我之前也做過類似的事情,但是在系統中,一個非常大的優勢就是它的體積非常大,因爲您的數據庫在短時間內會變成怪物。我很想看看stackoverflow如何處理它們的版本。 – thismat 2009-11-06 14:22:59

+0

@thismat - 你有一個觀點。我正在研究的應用程序是一個項目管理軟件,每天都會對數據進行大量更新。我看到的最大的客戶端數據庫大約是2.3 Gb,這確實不是那麼糟糕。如果它是面向公衆的,你可能會遇到更多問題。 – 2009-11-06 15:01:40

+0

@Justin Neissner,這並不像我想象的那麼糟糕。發展那麼大的時間是什麼? – thismat 2009-11-06 15:33:03

相關問題