数据库同步:服务器到本地

4
我有一个本地应用程序,使用SQLite。每当它有互联网访问时,它就会从服务器请求整个数据库,并从中重新创建本地数据库。本地和服务器数据库具有相同的结构,基本上本地数据库的目的是确保即使没有互联网也能正常运行。
这是一种非常低效的方法。 我的问题是,如何只请求缺失的数据?
我应该发送每个本地表的最后一个ID,并让服务器从那个ID开始发送数据吗? 如果现有的ID已被修改怎么办?这意味着应检查所有数据,但是发送整个数据库进行检查并获取修改或添加似乎也很愚蠢。
配置为本地SQLite,服务器MySQL。如果建议更改服务器,则可能可以将其更改为SQLite。
编辑: 多个客户端向同一个服务器MySQL数据库发出请求,PHP处理请求并回复。
您如何解决这个问题? 谢谢。

1
我建议将客户端更改为mysql--没有innodb的mysql并不那么重。而且你可以通过日志传送来进行复制。 - J-16 SDiZ
那是一个非常好的建议,但我恐怕本地客户端无法运行MySQL客户端。它需要SQLite或者无配置数据库。 - Francisc
1个回答

3

我建议将数据库中的行加上时间戳并按日期获取,或者使用rsync(或librsync或类似工具)来同步数据库文件。


时间戳听起来不错,但我担心每个记录添加一个14个字符的时间戳会增加数据库的大小。根据您的经验,这不是问题吗? - Francisc
如果服务器和客户端没有使用相同的二进制格式,客户端实际上不需要接收或存储时间戳(此外,MySQL很可能不会将TIMESTAMP存储为14个字符,如其范围所示(在2038年结束))。客户端只需要保留最后一次成功请求的时间。 - Hasturkun
MySQL的时间戳有超过14个字符,因为它添加了破折号和空格。我正在尝试将SQLite(本地)与MySQL(服务器)同步,我认为这意味着我需要在每个表的列中存储时间戳,因为有多个客户端要求从服务器更新其本地SQLite。 - Francisc
MySQL时间戳最可能以32位Unix时间值的形式存储,表示自纪元(1970-01-01 00:00:01)以来的秒数,这解释了范围(请参见DATETIME文档)。对于这些时间戳,不应该有显着的存储开销。仅为澄清起见,时间戳应表示行的最后修改时间。 - Hasturkun
好的,明白了,Hasturkun。谢谢你。看起来你对此有经验,那么告诉我,询问服务器类似于“这是我上次请求数据的时间,请发送更改”,然后得到SQL查询或数据的回复,我将在客户端应用程序中将其转换为查询语句。是这样做的吗? - Francisc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接