2012-08-14 172 views
2

我建立一個iOS應用,工程(創建,編輯)記錄(在sqlite的)記錄。如果應用程序中的記錄已從服務器下載並在本地進行修改,我正在複製,因爲我希望能夠恢復到服務器版本。因此,對於給定的記錄ID,我有時可以有兩個副本(服務器,本地)。我在設計數據庫佈局時尋求幫助。數據庫設計與服務器和同步到/從服務器數據庫的本地副本

最初,我使用的兩個表 - 一個用於存儲所述服務器記錄(通過同步到達的),以及一個用於存儲在本地修改/本地創建(尚未被同步)記錄。我發現這種方法很麻煩,因爲(a)我需要進行聚合搜索(選擇記錄優先考慮本地修改的副本),(b)我需要將數據從一個表移動到另一個表,這聽起來不像一個好的做法,和(c)架構非常複雜(數百列),並且保持兩個表架構同步是困難的。

然後我在一個表中合併的一切,增加一個狀態欄(服務器/本地)。這看起來很好,直到我意識到過濾重複記錄(對於服務器和本地副本都存在)是多麼複雜。計數,搜索,選擇所需的10線複雜的查詢(因爲SQLite中的限制) - 看到我的其他問題herehere

我考慮現在在一個表中藏在心裏,但拋棄了狀態欄,並跟蹤狀態創建一個單獨的表,每個記錄一行,像這樣:

數據:

id recordID name         col2 col3 ... 
1  1001  Server record, not changed locally xxxx xxxx ... 
2  1002  Server record changed locally  xxxx xxxx ... 
3  1002  Server record changed locally  xxxx yyyy ... 
4  1003  Record created locally    xxxx xxxx ... 
5  1004  Server record changed locally  xxxx xxxx ... 
6  1004  Server record changed locally  xxxx yyyy ... 

狀態跟蹤:

id recordID server local 
1  1001  1 
2  1002  2  3 
3  1003    4 
4  1004  5  6 

Aggrega如果需要顯示上述信息,則表示本地記錄,否則顯示服務器記錄 - 在本例中爲數據行1,3,4和6.在這種情況下,我的查詢會更簡單(只是與一個案例)。

這將是最好的辦法,或者有更好的設計,我應該使用?

回答

1

我會擺脫本地/服務器領域的地位,並介紹被設定爲當前日期,一旦雙方的一個改變記錄的時間戳/版本字段。因此,您始終知道哪些行是最新的記錄(具有最高時間戳的記錄)。爲了恢復舊版本的功能,我會考慮提供退回/轉發記錄的一個版本的選項。如果用戶選擇要恢復的舊版本,我會使用當前時間戳保存版本的新副本。

通過在協議上傳輸全部或部分(未知時間戳記錄)記錄,您可能可以實現輕鬆同步。考慮在客戶端&服務器端爲給定錶轉儲時間戳列表,比較增量列表併爲另一端準備插入狀態。 Et瞧,同步完成。唯一需要考慮的事情是不更新行,但用新的時間戳創建新版本。

這在數據倉庫系統中是非常好的實踐。 (沒有更新的理念)

如果你發現自己的每個記錄有大量的版本,你可能會定期扔掉最舊的記錄,如果有N個新版本的話。

相關問題