<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,大家請訪問 http://qaseven.github.io/

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

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

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

    評論

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

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

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

    dwd  回復(fù)  更多評論   

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

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

    <2016年8月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 2021精品国产品免费观看| 成人黄动漫画免费网站视频| 亚洲精品国产福利片| 全免费a级毛片免费看不卡| 在线播放亚洲精品| 亚洲AV无码乱码国产麻豆穿越| 成人免费黄色网址| 春意影院午夜爽爽爽免费| 亚洲一区二区三区四区在线观看| 成人午夜大片免费7777| 国产在线观a免费观看| 亚洲一线产品二线产品| 国产亚洲AV无码AV男人的天堂| 免费国产作爱视频网站| 一本大道一卡二大卡三卡免费| 亚洲国产精品久久久久婷婷老年| 日本二区免费一片黄2019| 无码囯产精品一区二区免费| 春暖花开亚洲性无区一区二区 | 最近中文字幕mv免费高清在线| 亚洲av无码专区首页| 久久久久亚洲Av片无码v| 国产成人免费网站在线观看 | 国产精品成人无码免费| 日韩精品久久久久久免费| 全部一级一级毛片免费看| 亚洲ts人妖网站| 亚洲AV人无码综合在线观看 | 97久久精品亚洲中文字幕无码| jjzz亚洲亚洲女人| 歪歪漫画在线观看官网免费阅读| 国产真人无码作爱免费视频| 老子影院午夜伦不卡亚洲| 亚洲人成网站看在线播放| 图图资源网亚洲综合网站| 久久久久亚洲爆乳少妇无| 国产免费观看网站| 成熟女人牲交片免费观看视频| **俄罗斯毛片免费| 国产精品免费无遮挡无码永久视频| 污视频网站在线观看免费|