One賬戶多設備同步的數據庫設計

雲是一個概念,雲的設計也很寬泛;在雲同步中我想經常會遇到多設備的問題。簡單來說就是用戶通過一個賬戶連接到雲,而後在任意可支持的設備上登陸同一個賬戶能實現賬戶數據共享的目的。
In This,我將簡單示範一種雲端一個賬戶多設備同步的數據庫設計方案;該設計並不是最優,但我想也算是一種思路。
如果大家有更好的方法,歡迎一起交流~~

需求

先來簡單說說需求;拿移動設備來說:此時有多個移動設備,我想要做的就是能把A設備的信息同步到B設備,當B設備有變更的時候也能同步回A設備,同理能同步到C設備。
再簡單點來說,就是在多個設備上能保證數據統一性。

這裏寫圖片描述
當然也可以這樣:
這裏寫圖片描述
這裏的雲之所以框起來,是因爲“雲“對用戶而言是不可見的;用戶認爲的只是設備與設備可以相互同步而已。
這裏寫圖片描述
純手工雲朵~~

分析

一般來說同步數據有以下情況(假設現在是兩臺設備):

  1. A添加一條數據,此時B應該得到新增的數據
  2. A修改一條數據,此時B應該同樣修改該數據
  3. A刪除一條數據,此時B應該把數據刪除
  4. A修改一條數據,B同時修改該數據,A先同步,此時B應該保留修改狀態,並同步B狀態到雲,隨後A同步爲B的狀態。(當然也可以先同步優先的法則)

嗯,暫時想到這麼多,也就是增刪改~

一休

一休大師發功了;
在這裏需要好好想想,我們來梳理一下。

AB設備都是使用的無數據新賬戶

  • 此時A設備新增等操作應該同步到數據庫,而後B設備使用同步把數據拿下來;當然此時我想需要有一個設備同步時間標識,用以標識僅僅同步未同步的數據。
  • AB設備在數據庫中具有一個最後一次同步時間的標識,而每次同步後時間改爲當前時間。
  • 需要同步的數據我想也是需要一個最後同步時間,當數據同步到雲時,代表了該數據進行變更,此時更改數據最後同步時間爲當前的時間。
  • 同時應該滿足的是,數據如果修改時的最後時間應該先設置,而設備的最後同步時間應該後設置(該操作是爲了避免A設備又把自己同步上來的數據同步回去,浪費流量)。

A設備使用一段時間,B登陸賬號

  • 因爲A已經使用一段時間,正常情況下,A的數據必定保持到了雲。
  • 此時B登陸賬號:那麼B屬於新增設備,其最後同步時間爲初始值,所以應該把雲中所有數據同步到B中。

A正常使用,B使用一段時間後刪除軟件,後又登陸賬號

區別於上一種情況:

  • B此時是登陸過的,那麼在數據庫中其最後同步時間是有一個值(非初始值)。
  • 如果按照此值進行同步,那麼必定B設備只能同步到這之後的數據,而該時間之前的數據將無法得到。
  • 此時應該在同步接口中傳入一個參數,是否是登陸賬號後第一次同步;該值隨着調用接口傳輸到雲同步中。當然你可以採用Get/Post/Socket也都是OK,具體實現看個人,重點在於設備需要傳回一個標識。
  • 假如該標識具備,那麼證明是登陸賬號後第一次同步,所以此時不用管雲數據中該設備的最後同步時間,而應該當作是第一次新增設備;所以需要同步回所有的數據。

刪除

刪除爲什麼需要單獨說?

A刪除了一條數據,此時進行同步,那麼雲中的數據應該如何變化?是刪除?還是加上刪除標識?還是其他?

假如刪除

  • 此時B設備同步,因爲B不可能每次同步的時候把自己現在的數據往雲發送過去(手機流量不夠吧)而僅僅發生B更改的數據。
  • 那麼B將不知道A刪除了數據,因爲數據庫中該數據已經沒有,那麼通過最後同步時間也就找不到,那麼B將一直保持該數據,直到下次B重新登陸賬號。所以刪除不可取。

假如加上標識

  • 該操作是可以成功的,A同步後改變標識爲已刪除,同時更改數據最後同步時間。
  • 此時B進行同步時將會得到該數據需要刪除的查詢,B也能正常刪除本地數據。
  • 但是這並不完整,原因是假如此時A同步後B也同步了或者有其他設備的存在也都刪除了,那麼該數據就應該從雲中清理掉。
  • 如果不清理那麼新登陸賬號的時候勢必會隨着所有數據同步到手機上,雖然是進行刪除操作,也不會影響設備數據,但是這也算數據冗餘。

我的方式

A此時刪除,那麼我把雲中該數據移動到臨時記錄表中。

  • 在移動的同時,判斷當前賬號在那些設備上有登陸。
  • 假如在ABC三個設備上有登陸,那麼就在臨時表中存儲時加上一個字段,該字段中綁定上現在未同步刪除的設備是BC;當B同步後就只剩餘C,假如C也同步刪除了那麼該數據就可以從臨時表中清除。
  • 如果移動的時候發現設備就只有A,那麼直接刪除該數據就OK。
  • 這樣的方式,基本能解決冗餘的問題,數據也只是臨時存在;當然這只是我的設計。

我其實並不想說這麼多,但是僅僅只是圖我想可能說不明白;下面來看看圖。

Created with Raphaël 2.1.0AABB提交A中變更雲變更,修改變更數據時間返回成功數據獲取變更數據根據B具體參數需要返回的數據返回B需要變更的數據提交B中用戶變更數據雲變更,修改變更數據時間返回成功數據............

實施

說的差不多了,該進行表的具體設計了;當然由於篇幅等等,表中的字段都儘量最少;字段主鍵也就用int代替了;能理清關係就好。

Account

賬戶表,同步數據當然最好還是有個賬戶好點的吧。該表主要用於記錄賬戶的信息,當然應該還包括密碼啊什麼的,不過這都不是重點。

字段:

  • Id:int 主鍵
  • Name:string 名字

Device

設備表,一個賬戶可以在多個設備上登陸,而每臺設備應該具備唯一標示;無論改設備登陸多少次但是其標示永遠都是唯一,這個取決於具體的設備,這裏就用SN來代替了。
當然設備表與賬戶的關係是:多對一關係;一個賬戶可以在多個設備登陸。

字段:

  • Id:int 主鍵
  • SN:string 標示
  • LastDate:date 最後同步時間
  • AccountId:int 外鍵 與Account表中 Id 字段對應
  • DeleteTempId:int 外鍵 與下面DeleteTemp表中 Id 字段對應

Notes

記錄表,這裏就用該表代替具體需要進行同步的數據了。
該表與賬戶的關係是:多對一 ;一個賬戶可以有無數的記錄。
該表與設備的關係是:多對多;不過這裏可不必有該關係。

字段:

  • Id:int 主鍵
  • Data:string 具體記錄的數據
  • LastDate:date 最後修改時間
  • AccountId:int 外鍵 與Account表中 Id 字段對應

DeleteTemp

刪除數據臨時存儲表;當刪除一條數據時如有其他設備可能(可能並不是絕對)存儲該數據時,應該把數據標示存儲到該表;而當可能存儲改數據的設備同步時可從該表中獲取到需要刪除的記錄。
當設備X獲取數據標示後,刪除該表中該數據中X設備的值,如果沒有任何設備持有該數據那麼刪除該數據。

該表與賬戶的關係是:多對一;但該關係不能直接關係而要通過設備進行關聯。
該表與設備的關係是:多對多;這裏需要持有該關係,設備通過關係可以直接查詢是否有需要刪除的數據;當獲取後設備與刪除數據的關係斷開;如數據未與任何設備有關係(所有設備都已經刪除了該數據)那麼刪除該數據。

字段:

  • Id:int 主鍵
  • NotesId:int 需要刪除的數據的ID
  • DeviceId:int 外鍵 與Device表中 Id 字段對應
  • AccountId:int 外鍵 與Account表中 Id 字段對應

按照上面的規則,最後的圖大約是這樣的:
這裏寫圖片描述

END

文章中文字較多,需要耐心看看纔行;後面看能不能儘量使用圖片重寫一下。
本篇文章是我的一種同步思路,當然具體情況中表會更加多,同步的數據也將更復雜,如有更好的思路,希望能一起交流。

========================================================
作者:qiujuer
博客:blog.csdn.net/qiujuer
網站:www.qiujuer.net
開源庫:github.com/qiujuer/Genius-Android
開源庫:github.com/qiujuer/Blink
轉載請註明出處:http://blog.csdn.net/qiujuer/article/details/48050625
—— 學之開源,用於開源;初學者的心態,與君共勉!

========================================================

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章