所以我有,似乎是一个常见的问题,我似乎无法找到答案。我正在尝试找到如何构建在本地维护数据的数据库的“最佳实践”,然后将该数据同步到许多客户端之间共享的远程数据库。为了使事情更清楚,这个远程数据库将有许多使用它的客户端。
例如,如果我有一个桌面应用程序存储了具有单独项目的待办事项列表(在SQL中)。然后,我希望能够将该数据发送到具有所有不同客户端信息的“主”副本的Web服务。 我并不担心同步问题,因为我只是想通过客户端表和Web服务表的实际架构来思考
以下是我如何思考它的一个例子:
客户数据库
list
--list_client_id (primary key, auto-increment)
--list_name
list_item
--list_item_client_id (primary key, auto-increment)
--list_id
--list_item_text
基于网络的主数据库 (在多个客户端之间共享)
list
--list_master_id
--list_client_id (primary key, auto-increment)
--list_name
--user_id
list_item
--list_item_master_id (primary key, auto-increment)
--list_item_remote_id
--list_id
--list_item_text
--user_id
客户可以创建包含项目的待办事项列表,并在任何给定时间将其与Web服务同步(即,如果它们丢失了数据连接,并且无法将信息发送到以后,则不会搞定了。 Web服务将使用客户端ID记录记录作为额外字段。 这样,客户端可以说“使用新名称更新列表编号4”,服务器将其视为“使用新名称更新用户12的列表编号4”。
答案 0 :(得分:0)
我认为他们正在使用的一般概念是正确的方向,但您可能需要特别注意使用自动增量列。例如,如果客户端是此ID的所有者,则服务器上的自动增量将毫无用处。相反,您可能希望list.list_master_id是自动增量。您提到的其他所有内容都是完全合理的,但如果每个用户可能有多个客户端,则复杂性可能会增加。然后,单独使用自动增量可能是不够的。相反,您可能需要一个guid或数据类型,它还包含一个客户端标识符,以防止ID冲突。
如果没有更多细节,很难推测您可能需要考虑的其他情况。
答案 1 :(得分:0)
SERVER:
list
--id
--name
--user_id
--updated_at
--created_from_device_id
Those 2 tables link all records, might be grouped in one table also.
list_ids
--list_id
--device_id
--device_record_id
user_ids
--user_id
--device_id
--device_record_id
CLIENT (device_id=5)
list
--id
--name
--user_id
--updated_at
这将允许您将记录保存为(仅显示相关字段):
server
list: id=1, name=shopping, user_id=1234
user: id=27, name=John Doe
list_ids: list_id=1, device_id=5, device_record_id=999
user_ids: user_id=27, device_id=5, device_record_id=567
client
id=999, name=shopping, user_id=567
这样他们完全不知道任何ID,翻译可以很快完成,你只能为客户提供他们所知道的信息和ID。
答案 2 :(得分:0)
我对我正在处理的项目有同样的问题,我的解决方案是在名为remote_id的本地表中创建一个额外的可为空的字段。如果remote_id为null,则在从本地数据库到远程数据库同步记录时,这意味着此行从未被同步,并且需要返回与远程行ID匹配的唯一ID。
Local Table Remote Table
_id (used locally)
remote_id ------------- id
name ------------- name
在客户端应用程序中,我通过_id字段链接表,远程我使用远程id字段来获取数据,进行连接等。
本地示例:
Local Client Table Local ClientType Table Local ClientType
_id
remote_id
_id -------------------- client_id
remote_id client_type_id -------------- _id
remote_id
name name name
远程示例:
Remote Client Table Remote ClientType Table Remote ClientType
id -------------------- client_id
client_type_id -------------- id
name name name
此方案在代码中没有任何逻辑,会导致数据完整性失败,因为client_type表可能与本地或远程表中的实际ID不匹配,因此每当生成remote_id时,它都会返回一个信号客户端应用程序要求更新本地_id字段,这会在sqlite中触发先前创建的触发器,以更新受影响的表。 http://www.sqlite.org/lang_createtrigger.html
1- remote_id在服务器中生成
2-向客户返回信号
3-客户端更新其_id字段并触发一个触发器,用于更新加入本地_id
的本地表当然,我还使用last_updated字段来帮助同步并避免重复同步。