我正在构建一个 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
聚合上述信息以进行显示意味着显示本地记录(如果有)或服务器记录 - 在这种情况下,数据行 1、3、4 和 6。在这种情况下,我的查询会更简单(只是与一件事)。
这是最好的方法,还是我应该使用更好的设计?