<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

    移動(dòng)端與服務(wù)器端數(shù)據(jù)庫(kù)同步

     最近在寫(xiě)一個(gè)移動(dòng)工具類(lèi)應(yīng)用。需要支持離線功能,所以本地需要一份數(shù)據(jù)庫(kù)的拷貝,這樣就涉及到移動(dòng)端和服務(wù)器端數(shù)據(jù)庫(kù)的同步問(wèn)題。
      在設(shè)計(jì)時(shí)我要滿足以下幾個(gè)需求:
      1. 同步時(shí)雙向傳輸數(shù)據(jù)最小化。雙向即,服務(wù)器端更新同步到移動(dòng)端,和移動(dòng)端更新同步到服務(wù)器。每次只傳輸兩端差異數(shù)據(jù)。
      2. 支持離線。支持離線本身是一種好的用戶體驗(yàn),而它帶來(lái)的一個(gè)其他的好處是每次移動(dòng)端數(shù)據(jù)庫(kù)查詢僅需查詢本地?cái)?shù)據(jù)庫(kù),這樣就避免了過(guò)多的服務(wù)器端查詢。本地?cái)?shù)據(jù)庫(kù)減少了很多服務(wù)器的壓力,當(dāng)然也給用戶省了流量。數(shù)據(jù)庫(kù)更新操作也是如此,僅更新本地?cái)?shù)據(jù)庫(kù),然后在適當(dāng)?shù)臅r(shí)機(jī)與服務(wù)器端進(jìn)行同步。更進(jìn)一步的說(shuō),移動(dòng)端查詢和更新數(shù)據(jù)只跟本地?cái)?shù)據(jù)庫(kù)打交道。
      3. 沖突解決。如果一個(gè)用戶帳號(hào)在多個(gè)移動(dòng)端進(jìn)行離線使用,勢(shì)必會(huì)產(chǎn)生數(shù)據(jù)沖突。
      設(shè)計(jì)的關(guān)鍵在于數(shù)據(jù)模型的設(shè)計(jì),和同步算法。以下是我的想法。
      下面是對(duì)象類(lèi)代碼,對(duì)應(yīng)數(shù)據(jù)庫(kù)的表字段。
      服務(wù)器端設(shè)計(jì):
    public abstract class ServerBaseModel {
    public long userId; /* Global unique user id */
    public long id; /* Model id. Unique for user */
    public long lastmodified; /* Last modified server time stamp */
    public boolean deleted; /* delete flag */
    }
      移動(dòng)端設(shè)計(jì):
    public abstract class ClientBaseModel {
    public long userId; <span style="font-family: Arial, Helvetica, sans-serif;">/* Global unique user id */</span>
    public long id; /* Model id. Unique for user */
    public long lastmodified; /* Last modified server time stamp */
    public boolean deleted; /* delete flag */
    public boolean dirty; /* Local dirty flag */
    }
      分析:
      首先是如何選擇表的主鍵id
      1. 使用auto increment主鍵?不行!根據(jù)前面支持離線的需求,id應(yīng)該在移動(dòng)端就已經(jīng)生成。如果使用auto increment在同一個(gè)用戶帳號(hào)的情況下只可以做到單個(gè)移動(dòng)端的唯一性,無(wú)法保證多個(gè)移動(dòng)端的唯一性,更加不能保證服務(wù)器端全局的唯一性。
      2. 使用UUID作為主鍵?可行!每一條數(shù)據(jù)在移動(dòng)端創(chuàng)建時(shí)即為之生成UUID。這樣基本可以保證服務(wù)器端全局的唯一性。對(duì)于使用UUID作為主鍵好不好的討論很多,大家可以另行參考。
      3. 我的方案。使用userId和一個(gè)用戶唯一的model id作為聯(lián)合主鍵。model id需要保證在同一userId下唯一,這樣再加上userId使得數(shù)據(jù)全局唯一。問(wèn)題是如何選擇model id?一個(gè)比較可行但是不能保證完全沒(méi)有重復(fù)的是時(shí)間戳。
      4. 還有其他更好的主鍵方案嗎?
      接下來(lái)是如何判斷服務(wù)器端數(shù)據(jù)已經(jīng)更新
      每一條數(shù)據(jù)存儲(chǔ)一個(gè)last modified時(shí)間戳。這個(gè)時(shí)間戳是服務(wù)器端的時(shí)間。同一條數(shù)據(jù)如果移動(dòng)端的lastmodified小于服務(wù)器端的lastmodified就可以判斷數(shù)據(jù)已經(jīng)更新。
      移動(dòng)端數(shù)據(jù)更新
      移動(dòng)端數(shù)據(jù)庫(kù)增加一個(gè)dirty標(biāo)志,dirty標(biāo)志表示本地新增或者修改的數(shù)據(jù),這些數(shù)據(jù)會(huì)在下一次同步時(shí)上傳至服務(wù)器。
      如何處理數(shù)據(jù)刪除
      根據(jù)前面last modified和dirty字段的設(shè)計(jì),整個(gè)數(shù)據(jù)模型是一個(gè)增量式的。數(shù)據(jù)只允許新增和更新,所以這里增加一個(gè)deleted標(biāo)志表示數(shù)據(jù)是否已經(jīng)被刪除。
      以上介紹完我的移動(dòng)端和服務(wù)器端數(shù)據(jù)庫(kù)同步的數(shù)據(jù)模型設(shè)計(jì),接下來(lái)講講詳細(xì)同步算法。
      不過(guò)。。。等等。。。公司年會(huì)的節(jié)奏,等有時(shí)間繼續(xù)寫(xiě)。
      同步算法:
      1. 服務(wù)器端向移動(dòng)端同步
      2. 移動(dòng)端向服務(wù)器端同步
      android帳號(hào)驗(yàn)證框架

    posted on 2014-01-27 10:50 順其自然EVO 閱讀(3350) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): android

    評(píng)論

    # re: 移動(dòng)端與服務(wù)器端數(shù)據(jù)庫(kù)同步 2014-04-15 15:19 于老大

    好文,期待算法  回復(fù)  更多評(píng)論   

    # re: 移動(dòng)端與服務(wù)器端數(shù)據(jù)庫(kù)同步 2016-08-10 08:13 ののswd

    dwd  回復(fù)  更多評(píng)論   

    # re: 移動(dòng)端與服務(wù)器端數(shù)據(jù)庫(kù)同步 2016-08-10 08:15 大太陽(yáng)

    這個(gè)到底是怎么弄呢?期待更詳細(xì)的內(nèi)容  回復(fù)  更多評(píng)論   

    <2014年1月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    導(dǎo)航

    統(tǒng)計(jì)

    常用鏈接

    留言簿(55)

    隨筆分類(lèi)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 免费无遮挡无码视频网站| 亚洲人成色4444在线观看| 免费国产怡红院在线观看| 曰批全过程免费视频网址| A片在线免费观看| 污污的视频在线免费观看| 亚洲日韩久久综合中文字幕| 亚洲韩国在线一卡二卡| 亚洲精品V欧洲精品V日韩精品| 四虎永久免费影院在线| 午夜神器成在线人成在线人免费| 最近中文字幕电影大全免费版| 日本高清高色视频免费| 91在线免费观看| 好猛好深好爽好硬免费视频| 黄色a级片免费看| 真人无码作爱免费视频| 亚洲欧美国产国产综合一区| 亚洲国产成人精品无码一区二区| 亚洲国产综合专区电影在线| 久久久青草青青亚洲国产免观| 亚洲午夜久久久久久久久电影网 | 亚洲av无码国产精品色午夜字幕 | 亚洲色偷偷综合亚洲AV伊人蜜桃 | 中国一级特黄的片子免费 | 国产又大又黑又粗免费视频 | 亚洲精品无码av中文字幕| 亚洲国产最大av| 在线a亚洲老鸭窝天堂av高清| 亚洲av永久无码精品天堂久久 | 免费精品国偷自产在线在线| 最近最新高清免费中文字幕| 777爽死你无码免费看一二区 | 亚洲中文字幕无码爆乳| 亚洲熟女www一区二区三区| 亚洲色大成网站www永久男同| 亚洲日韩精品无码专区加勒比| 亚洲精品无码久久久久APP | 国产精品亚洲综合一区| 亚洲熟妇无码乱子AV电影| 亚洲另类激情综合偷自拍图 |