One账户多设备同步的数据库设计
Posted Qiujuer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了One账户多设备同步的数据库设计相关的知识,希望对你有一定的参考价值。
序
云是一个概念,云的设计也很宽泛;在云同步中我想经常会遇到多设备的问题。简单来说就是用户通过一个账户连接到云,而后在任意可支持的设备上登陆同一个账户能实现账户数据共享的目的。
In This,我将简单示范一种云端一个账户多设备同步的数据库设计方案;该设计并不是最优,但我想也算是一种思路。
如果大家有更好的方法,欢迎一起交流~~
需求
先来简单说说需求;拿移动设备来说:此时有多个移动设备,我想要做的就是能把A设备的信息同步到B设备,当B设备有变更的时候也能同步回A设备,同理能同步到C设备。
再简单点来说,就是在多个设备上能保证数据统一性。
当然也可以这样:
这里的云之所以框起来,是因为“云“对用户而言是不可见的;用户认为的只是设备与设备可以相互同步而已。
纯手工云朵~~
分析
一般来说同步数据有以下情况(假设现在是两台设备):
- A添加一条数据,此时B应该得到新增的数据
- A修改一条数据,此时B应该同样修改该数据
- A删除一条数据,此时B应该把数据删除
- 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。
- 这样的方式,基本能解决冗余的问题,数据也只是临时存在;当然这只是我的设计。
我其实并不想说这么多,但是仅仅只是图我想可能说不明白;下面来看看图。
实施
说的差不多了,该进行表的具体设计了;当然由于篇幅等等,表中的字段都尽量最少;字段主键也就用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
—— 学之开源,用于开源;初学者的心态,与君共勉!
========================================================
以上是关于One账户多设备同步的数据库设计的主要内容,如果未能解决你的问题,请参考以下文章