您提出的問題無法在幾段中回答,或者只是簡單回答。不過,這裏是我的嘗試......
首先,你已經通過與做法困難號碼:
- 客戶端必須始終網絡連接到創建的數據以及從服務器接收的鑰匙。
- 如果您確實創建了不同的商店(localstorage & REST),則所有需要數據的應用程序代碼都必須在兩個商店中查找。這顯着增加了應用程序的每個部分的複雜性。
- 創建行後,如果要創建子行,則必須等待服務器返回主鍵,然後才能將其作爲子行中的外鍵引用。對於任何中等複雜的數據結構,這成爲一個沉重的負擔。
- 服務器關閉時,所有客戶端都無法創建數據。
這是我的方法。它使用SequelSphereDB,但大多數概念可以在其他客戶端數據管理系統中重複使用。
第一:對主鍵使用UUID。
大多數客戶端數據管理系統應提供生成通用唯一ID的方式。SequelSphere只需使用SQL函數即可完成它:UUID()。通過將UUID作爲每行的主鍵,可以隨時在任何客戶端上生成主鍵,而無需與服務器聯繫,並且仍然保證ID是唯一的。這也因此允許應用程序以「脫機」模式工作,而不需要在運行時連接到服務器。這也使得服務器不能將所有客戶端關閉。
SECOND:使用一組鏡像服務器的表。
這比其他任何事情都更需要簡單性。這也是接下來兩項基本原則的要求。
THIRD:對於小數據集的向下同步,從服務器完全刷新客戶端數據是更可取的。
只要有可能,就從服務器執行客戶端數據的完整刷新。這是一個更簡單的範例,並且導致內部數據完整性問題更少。主要缺點是傳輸中的數據大小。
第四:對於大型數據集的下行同步,進行「交易」更新
這是我的做法變得有點複雜。如果數據集太大,並且只要求更改的行同步,則必須根據「事務」找到同步它們的方法。即:插入/更新/刪除按服務器上執行的順序進行插入/更新/刪除,以提供用於在客戶機上執行相同操作的簡單腳本。
最好在服務器上有一張表格,記錄要同步到設備的交易。如果這不可行,那麼通常可以在服務器上使用行上的時間戳記錄訂單,並讓客戶機要求自特定時間戳以來的所有更改。大負面影響:您需要通過「邏輯」刪除或通過在自己的表中跟蹤刪除行來跟蹤刪除的行。即使如此,將服務器的複雜性隔離開來,最好將其分散到所有客戶端。
第五:對於向上的同步,用「交易」的更新
這是SequelSphereDB真正的亮點:它會跟蹤你所有的插入,更新和刪除對錶進行,然後在同步時間將它們提供給您。它甚至可以跨瀏覽器重新啓動,因爲它將信息保存在localstorage/indexeddb中。它甚至可以適當地處理提交和回滾。客戶端應用程序可以像平常一樣與數據進行交互,而不必考慮記錄更改,然後使用SequelSphereDB的「更改跟蹤器」在同步時重播更改。
如果您的未使用 SequelSphere(應該是),則在客戶端上保留一個單獨的表以記錄客戶端執行的所有插入,更新和刪除操作。每當客戶端應用程序插入/更新/刪除行時,在「事務」表中複製該行。在向上同步時,發送這些。在服務器上,只需按照相同的順序執行相同的步驟即可複製客戶端上的數據。
同樣重要:始終在從服務器完全刷新客戶端表之前執行向上同步。:)
結論
我建議在儘可能多的地方儘量在複雜性去爲簡單。對主鍵使用UUID對此非常有幫助。使用某種「更改跟蹤器」也非常有用。使用像SequelSphereDB這樣的工具來跟蹤你的變化是最有用的,但這種方法不是必須的。
完整披露:我與公司SequelSphere密切相關,但該產品真的不是實施上述方法所必需的。
本文提供了一些見解:http://engineering.linkedin.com/mobile/linkedin-ipad-using-local-storage-snappy-mobile-apps –