2015-05-15 152 views
0

我正在构建一个应用程序,允许用户插入数据并与网站同步。用户也可以在网站上插入数据。有两个实体表(T1T2)和一个N-M关系表(TR)。两个或Android设备和网站之间的数据同步

数据结构(这只是举例):

T1 (_id, name, modified) 
T2 (_id, name, modified) 
TR (t1_id, t2_id) 

我现在面临的问题是ID的数据同步。例如。设备A1和A2处于脱机状态,并在ID = 1时同时插入记录。联机同步开始后,与ID发生冲突。我想过介绍一个额外的列gid - 类似全局ID。所以结构将是:

T1 (_id, name, modified, gid) 
T2 (_id, name, modified, gid) 
TR (t1_id, t2_id, t1_gid, t2_gid) 

全局ID将由网站分配。

但我不确定这是否是一种好方法(从未做过这样的事情,也不知道是否会有未来的问题)。

回答

3

您必须使用其他ID,假设network_id,生成服务器上的所有network_id并在设备上使用本地ID(例如UUID)。当您发送创建实体请求服务器时,会生成一个真实的ID并将其返回给您,因此您可以使用network_id更新本地数据库。仅当您没有network_id时,将network_id用作主域和local_id非常重要。

+0

感谢您的回答。所以,如果我明白了,'network_id'就是我的'gid',它应该是服务器上的常规主键。但关系呢?我不得不返回'network_id'-s来更新本地关系行。或者我不需要这样做,因为关系将被保存在具有本地ID的设备上,并且具有网络ID的服务器上 - 数字值将会不同,但关系本身将被保留。我对吗? –

+0

是的,你是对的。但为了避免不可预知的错误,将网络标识符(您的全球标识符)添加到关系中会更好。因为当你改变服务器上的关系时,例如将以前不存在的项目新关系添加到现有项目中会产生一些难以调试的问题。如果所有数据都相似,那么最好。由于您的设备中包含项目的网络ID,因此无需在本地编号 –

+0

好吧,因此我的本地设备上会有'network_id',所以表格结构将与我上面提到的相同(第二个块的代码)。但是在服务器上,不需要存储本地ID,只需在上传后为本地设备定义'id',这将是'network_id'。 –

相关问题