2011-08-05 89 views
0

我公司对我们客户的每台移动计算机上的软件都有一个本地MySQL数据库。这些移动电脑通过移动宽带卡连接到互联网。我们将要读取的信息发送到一个字符串中,并通过范围从1kb到600kb的XML文件存储在客户的本地数据库中。 (注意:我们这样做是为了让客户在互联网连接不可用时仍可访问数据。)数据库同步问题

1-600kb XML文件存储在我们服务器上每个用户的文件夹中,直到它们通过.net/C#webservice将文件提供给使用其令牌调用We​​b服务的客户端。第一次连接时,客户可能有多达20-40MB的这些小XML文件。在正常的日子里,他们可以下载最多几MB的这些文件。客户移动数据终端上的软件每10秒钟用一个web服务检查服务器上文件夹中的文件。

每15分钟创建一个新的XML文件,其中需要对用户的数据库进行更改,如果没有更改,则不会创建XML文件。最大的XML文件(600kb)拥有用户本地数据库的1000条记录。每个记录有10个以上的列,其中有10个以上的字符。

与我们的方法的问题是:

  • 这种方法是缓慢的。 (可能需要1.5小时才能同步一个空数据库。)

  • XML文件没有压缩,所以下载大小比所需的大。

  • XML文件比它们需要的大,因为它们包含不必要的信息。

  • 我们没有跟踪用户数据库中的内容,因此用户可能会失去同步。

  • 它是基于文件的,这会导致硬盘上的大量读/写操作。

任何人都可以提出一个更好的方法来做到这一点?

回答

0

听起来像是两个问题给我。

  1. 更新用户数据库到最新的master数据库可以通过跟踪版本来完成。用户在调用时提交他们的版本号,并且返回需要将其版本更新到最新版本的SQL。每次更新master数据库时,都要生成SQL以从每个可能的先前版本更新,然后只返回适当的SQL。我说SQL是因为它看起来更有效率,但是你可以使用XML或者JSON或者其他类型,并且它对于版本来说效率更高。

  2. 尊重用户本地更改是一个更具挑战性的问题。您可以将用户更改保存为SQL或其他格式,并在更新后重新应用它们。但谁拥有最新/最好的信息是一个难题。通常你需要比用户记录更大的粒度。一个系统可以更新部分信息 - 比如联系人的电话号码 - 而另一个系统更新另一个部分,比如他们的电子邮件。如果系统必须选择一个联系人条目或另一个联系人条目,则无论采用哪种方式,都会丢失。为了做到正确,你必须给每个领域的变化添加时间戳。如果远程设备始终处于联机状态,则尝试进行同步并尝试用户每次想要更改时解决冲突的可能性会更好。