我建立一個iOS應用,工程(創建,編輯)記錄(在sqlite的)記錄。如果應用程序中的記錄已從服務器下載並在本地進行修改,我正在複製,因爲我希望能夠恢復到服務器版本。因此,對於給定的記錄ID,我有時可以有兩個副本(服務器,本地)。我在設計數據庫佈局時尋求幫助。數據庫設計與服務器和同步到/從服務器數據庫的本地副本
最初,我使用的兩個表 - 一個用於存儲所述服務器記錄(通過同步到達的),以及一個用於存儲在本地修改/本地創建(尚未被同步)記錄。我發現這種方法很麻煩,因爲(a)我需要進行聚合搜索(選擇記錄優先考慮本地修改的副本),(b)我需要將數據從一個表移動到另一個表,這聽起來不像一個好的做法,和(c)架構非常複雜(數百列),並且保持兩個表架構同步是困難的。
然後我在一個表中合併的一切,增加一個狀態欄(服務器/本地)。這看起來很好,直到我意識到過濾重複記錄(對於服務器和本地副本都存在)是多麼複雜。計數,搜索,選擇所需的10線複雜的查詢(因爲SQLite中的限制) - 看到我的其他問題here和here。
我考慮現在在一個表中藏在心裏,但拋棄了狀態欄,並跟蹤狀態創建一個單獨的表,每個記錄一行,像這樣:
數據:
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.在這種情況下,我的查詢會更簡單(只是與一個案例)。
這將是最好的辦法,或者有更好的設計,我應該使用?