数据库设计与服务器和同步到/从服务器数据库的本地副本

问题描述:

我建立一个iOS应用,工程(创建,编辑)记录(在sqlite的)记录。如果应用程序中的记录已从服务器下载并在本地进行修改,我正在复制,因为我希望能够恢复到服务器版本。因此,对于给定的记录ID,我有时可以有两个副本(服务器,本地)。我在设计数据库布局时寻求帮助。数据库设计与服务器和同步到/从服务器数据库的本地副本

最初,我使用的两个表 - 一个用于存储所述服务器记录(通过同步到达的),以及一个用于存储在本地修改/本地创建(尚未被同步)记录。我发现这种方法很麻烦,因为(a)我需要进行聚合搜索(选择记录优先考虑本地修改的副本),(b)我需要将数据从一个表移动到另一个表,这听起来不像一个好的做法,和(c)架构非常复杂(数百列),并且保持两个表架构同步是困难的。

然后我在一个表中合并的一切,增加一个状态栏(服务器/本地)。这看起来很好,直到我意识到过滤重复记录(对于服务器和本地副本都存在)是多么复杂。计数,搜索,选择所需的10线复杂的查询(因为SQLite中的限制) - 看到我的其他问题herehere

我考虑现在在一个表中藏在心里,但抛弃了状态栏,并跟踪状态创建一个单独的表,每个记录一行,像这样:

数据:

id recordID name         col2 col3 ... 
1  1001  Server record, not changed locally xxxx xxxx ... 
2  1002  Server record changed locally  xxxx xxxx ... 
3  1002  Server record changed locally  xxxx yyyy ... 
4  1003  Record created locally    xxxx xxxx ... 
5  1004  Server record changed locally  xxxx xxxx ... 
6  1004  Server record changed locally  xxxx yyyy ... 

状态跟踪:

id recordID server local 
1  1001  1 
2  1002  2  3 
3  1003    4 
4  1004  5  6 

Aggrega如果需要显示上述信息,则表示本地记录,否则显示服务器记录 - 在本例中为数据行1,3,4和6.在这种情况下,我的查询会更简单(只是与一个案例)。

这将是最好的办法,或者有更好的设计,我应该使用?

我会摆脱本地/服务器领域的地位,并介绍被设定为当前日期,一旦双方的一个改变记录的时间戳/版本字段。因此,您始终知道哪些行是最新的记录(具有最高时间戳的记录)。为了恢复旧版本的功能,我会考虑提供退回/转发记录的一个版本的选项。如果用户选择要恢复的旧版本,我会使用当前时间戳保存版本的新副本。

通过在协议上传输全部或部分(未知时间戳记录)记录,您可能可以实现轻松同步。考虑在客户端&服务器端为给定表转储时间戳列表,比较增量列表并为另一端准备插入状态。 Et瞧,同步完成。唯一需要考虑的事情是不更新行,但用新的时间戳创建新版本。

这在数据仓库系统中是非常好的实践。 (没有更新的理念)

如果你发现自己的每个记录有大量的版本,你可能会定期扔掉最旧的记录,如果有N个新版本的话。