维护移动客户端和服务器之间的参照完整性


21

所以我有一个相对简单的系统。一个移动客户端在sqlite数据库中创建我想同步到远程SQL服务器(与其他移动客户端共享)的记录。因此,当我在电话的sqlite表中创建新记录时,我随后通过RESTful API将更改推送到远程服务。我遇到的问题是如何排序主键,以便数据中没有冲突(即电话中的记录具有与服务器上完全不同的记录相同的主键)。在客户端上引用记录并在服务器上引用相同记录的最佳实践是什么?


1
最重要的想法是,客户端充当Web服务器的缓存,并在客户端中创建更改,然后将更改推送到Web服务器
JoeCortopassi 2012年

Answers:


22

通常的做法是使用uniqueidentifier密钥(有时称为UUID或GUID)构造数据库。您可以在两个地方创建它们,而无需担心碰撞。

接下来,您的移动应用程序需要从服务器同步“事实”表,然后才能创建新行。创建新行时,请在本地进行操作,然后再次同步时,会将新行添加到服务器。您也可以对更新和删除执行相同的操作。

要跟踪插入,您需要在行上创建时间戳。要跟踪更新,您需要跟踪行上的LastUpdate时间戳。要跟踪删除,您需要一个墓碑表。

请注意,进行同步时,需要检查服务器与移动设备之间的时间偏移,并且需要一种解决冲突的方法。插入没什么大不了的(它们不应该冲突),但是更新可能会冲突,而删除可能会与更新冲突。

有处理此类问题的框架,例如Microsoft Sync Framework


同步框架是否仍然有效
Sadaquat

7

我敢打赌,毫无疑问,您绝对不能在两者之间具有参照完整性。具体来说,您的用户是否希望移动应用程序在断开连接后能够正常工作?

有两种做法:

一种是在客户端上创建“临时”记录,然后在将它们同步到服务器时让中央系统分配ID。客户可以更新本地记录以反映该情况。

另一个是,您以一种(通常是概率方式)允许客​​户端创建ID而不会发生冲突的方式来分发ID创建。

为此,请转到UUID-v4不太可能发生冲突。

否则,请考虑将唯一的移动设备ID放入记录ID中的方法。因此,您的记录ID可能是${imei}-${local sequence number}IMEI保证唯一性的东西,而本地序列号只是常规的顺序数据库ID。



0

我正在处理的项目存在相同的问题,我的解决方案是在名为remote_id的本地表中创建一个额外的可空字段。如果remote_id为null,则将记录从本地数据库同步到远程数据库时,这意味着该行从未同步过,需要返回与远程行ID匹配的唯一ID。

Local Table            Remote Table

_id (used locally)
remote_id ------------- id
name      ------------- name

在客户端应用程序中,我通过_id字段链接表,远程使用远程ID字段获取数据,进行联接等。

本地示例:

Local Client Table       Local ClientType Table      Local ClientType
                         _id
                         remote_id  
_id -------------------- client_id
remote_id                client_type_id -------------- _id
                                                      remote_id
name                    name                          name

远程示例:

Remote Client Table      Remote ClientType Table      Remote ClientType
id -------------------- client_id
                        client_type_id -------------- id
name                    name                          name

这种情况且代码中没有任何逻辑,将导致数据完整性失败,因为client_type表可能与本地或远程表中的真实ID不匹配,因此,每当生成remote_id时,它都会向客户端应用程序返回信号要求更新本地_id字段,这会在sqlite中触发先前创建的触发器,以更新受影响的表。 http://www.sqlite.org/lang_createtrigger.html

1-服务器中生成remote_id

2-向客户端返回信号

3-客户端更新其_id字段并触发一个触发器,该触发器更新加入本地_id的本地表

当然,我也使用last_updated字段来帮助同步并避免重复的同步。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.