保持本地和远程sql数据库之间数据完整性的最佳方法

时间:2012-01-31 02:37:15

标签: sql web-services mobile synchronization

所以我有,似乎是一个常见的问题,我似乎无法找到答案。我正在尝试找到如何构建在本地维护数据的数据库的“最佳实践”,然后将该数据同步到许多客户端之间共享的远程数据库。为了使事情更清楚,这个远程数据库将有许多使用它的客户端。

例如,如果我有一个桌面应用程序存储了具有单独项目的待办事项列表(在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”。

3 个答案:

答案 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字段来帮助同步并避免重复同步。