数据库设计与服务器和同步到/从服务器数据库的本地副本
我建立一个iOS应用,工程(创建,编辑)记录(在sqlite的)记录。如果应用程序中的记录已从服务器下载并在本地进行修改,我正在复制,因为我希望能够恢复到服务器版本。因此,对于给定的记录ID,我有时可以有两个副本(服务器,本地)。我在设计数据库布局时寻求帮助。数据库设计与服务器和同步到/从服务器数据库的本地副本
最初,我使用的两个表 - 一个用于存储所述服务器记录(通过同步到达的),以及一个用于存储在本地修改/本地创建(尚未被同步)记录。我发现这种方法很麻烦,因为(a)我需要进行聚合搜索(选择记录优先考虑本地修改的副本),(b)我需要将数据从一个表移动到另一个表,这听起来不像一个好的做法,和(c)架构非常复杂(数百列),并且保持两个表架构同步是困难的。
然后我在一个表中合并的一切,增加一个状态栏(服务器/本地)。这看起来很好,直到我意识到过滤重复记录(对于服务器和本地副本都存在)是多么复杂。计数,搜索,选择所需的10线复杂的查询(因为SQLite中的限制) - 看到我的其他问题here和here。
我考虑现在在一个表中藏在心里,但抛弃了状态栏,并跟踪状态创建一个单独的表,每个记录一行,像这样:
数据:
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个新版本的话。