2012-10-28 79 views
3

我一直在使用後端數據庫更新幾年的應用程序。整個關鍵在於所有內容都緩存在客戶端上,因此它永遠不需要網絡連接來操作,但是當它確實有連接時,它總是會取得最新的更新。每更新一次應用程序都附帶最新版本的數據庫,我希望它在數據庫更新時只下載最少量的數據。增量更新應用程序數據的最佳方法

我目前使用帶時間戳的表來檢查更新。它看起來像這樣。

ID - Name - Description- Severity - LastUpdated 
0 - test.exe - KnownVirus - Critical - 2009-09-11 13:38 
1 - test2.exe - Firewall - None - 2009-09-12 14:38 

這種方法對於我以前需要的很好,但我期待擴大應用程序的更多功能以使用此類動態方法。所有的數據當前存儲爲XML,但我不想將完整的XML文件存儲在數據庫中,只傳輸更改的數據。

那麼,你會如何去允許一個相當簡單的方法來存儲數據庫中的動態內容(text/xml/json/xaml),並讓客戶端只下載新的更新?我在想有能處理XML的邏輯直接插入

ID - Data - Revision 
15 - XXX - 15 

XXX會像<Content><File>Test.dll<File/><Description>New DLL to load.</Description></Content>,並會被插入到緩存中,而這顯然是複雜的,因爲我需要加載它們的順序。

已經提到的另一種方法是基於類似於源代碼管理的東西,將版本存儲在文件的根目錄中並計算增量以找出需要發送到客戶端的最小數據量。

任何人有任何建議如何處理這個沒有數據損壞的風險?我還將擴展功能,使我能夠恢復可能的不良修訂,並用新的工作替換它們。

回答

4

這實際上取決於您使用的工具和您已有的架構。是否已有一臺具有邏輯和數據訪問層的服務器?

動態方法可能會變得複雜,速度慢並限制解決方案的數量。爲什麼你需要一個動態結構?在關係數據庫中使用名稱 - 值對方法添加數據是否可行?靜態和統一的數據結構更容易處理。

在進入細節之前,您應該考慮不同的情況。

  • 項目可以添加
  • 項目可以改變
  • 的,可以刪除(我認爲)

增加是不是一個大問題。客戶端需要記住它從服務器獲取的最後一個修訂版本號,然後編寫一個查詢,從那裏獲取所有內容。

更改基本相同。你應該關心物品的識別。您需要一個不可更改的代理鍵,因爲它似乎是您已擁有的ID。 (Guids可能在這裏很有用。)

刪除是棘手的。您需要將項目標記爲已刪除,而不是實際刪除它們,或者在刪除ID時使用修訂號碼列出已刪除的ID。

將數據存儲在客戶端:考慮在客戶端使用像SQLite這樣的關係數據庫。 (它不需要安裝,它只是存儲在一個文件中,例如Firefox在SQLite數據庫中存儲了很多)。當在服務器中使用相同的代碼時,可以重新使用一些代碼。它也是基於事務的,它有助於保持一致(在同步期間出現錯誤時回滾)。

XML - 如果您確實需要它 - 可以存儲爲數據庫中的字符串。

當使用支持SQLite的抽象層或ORM(例如NHibernate)時,即使服務器使用另一個數據庫,也可以重用一些代碼。請注意,這種ORM的學習曲線可能相當陡峭。如果你不知道這樣的事情,那可能太多了。

您不需要強制重用客戶端和服務器中的代碼。

同步本身不應該很複雜。你在客戶端有一個修訂版本號,在服務器裏有最新版本。您從客戶那裏獲得所有新/更改和刪除的項目,並將其應用到當地商店。更新本地修訂號。承諾。完成。

我永遠不會只更新修訂版的一部分,因爲那樣你就無法真正瞭解自上次同步以來發生了哪些變化。因爲你做了差異更新,所以必須有一個良好定義的客戶端狀態。

+0

這幾乎是我現在正在做的,只是進一步。我目前使用Web服務作爲後端提供邏輯和數據訪問層。根據你的文章,我想我會簡單地建立在現有的結構上,並採取一些你提供的信息來進一步改進。 – eandersson

4

我會去解決使用Sync Framework。從微軟

報價:

微軟同步框架是一個全面的同步平臺,使應用程序,服務和設備的協作和脫機。開發人員可以構建同步生態系統,將任何應用程序,任何商店中的任何數據通過任何網絡使用任何協議。 Sync Framework具有支持漫遊,共享和使數據脫機的技術和工具。

Sync Framework的一個關鍵方面是能夠創建自定義提供程序。提供者允許任何數據源參與Sync Framework同步過程,從而允許發生點對點同步。

+0

感謝。聽起來很有趣 - 我會將其視爲一種可能的解決方案。 – eandersson

2

你沒有說你的後端數據庫是什麼,但是如果是SQL Server,你可以使用SqlCE(SQL Server Compact Edition)作爲客戶端數據庫,然後使用RDA合併複製來根據需要更新客戶端數據庫。這將確保您處理所有需求;爲了達到這樣一個共同的要求,沒有必要重新發明輪子。

+0

我此刻使用MySQL,但我比其他選項更開放。 – eandersson

+0

我沒有使用過多的MySQL,但顯然它支持單向複製,這意味着只要您可以在客戶端應用程序以及後端使用MySQL實例,就可以實現您的目的(我不需要知道MySQL數據庫是否可以作爲單個客戶端文件分發)。除了您需要後端數據庫的許可證之外,SQL Server + SqlCE對您來說非常合適。 – MusiGenesis

+0

謝謝@MusiGenesis。我會考慮在下次更新時對這種解決方案進行改進,以徹底改革整個系統。 – eandersson

4

我剛剛構建了一個與您所描述的完全一樣的應用程序。我在DjSol提到的Microsoft Sync Framework之上構建它。

我在C#前端應用程序中使用SqlCe數據庫,在另一端使用SQL 2005 Server。

以下文章是非常有用的,我:

Tutorial: Synchronizing SQL Server and SQL Server Compact

Walkthrough: Creating a Sync service

Step by step N-tier configuration of Sync services for ADO.NET 2.0

How to Sync schema changed database using sync framework?

+0

謝謝 - 這些都非常有幫助。 – eandersson

相關問題