在与主数据库同步时,人们如何处理客户端上的外键

时间:2010-03-26 23:44:41

标签: database synchronization

我正在编写一个具有离线支持的应用程序。即浏览器/移动客户端经常将命令同步到主数据库。

我在客户端和服务器端都使用uuid。当同步到服务器时,servre将返回本地uuids(luid)到服务器uuids(suid)的映射。收到此映射后,客户端使用适当的值更新其记录suid属性。

然而,说客户记录,例如一个待办事项,有一个属性'list_id',它保存todos列表记录的外键。我在客户端的foreign_keys中使用luids。但是,当该属性被发送到服务器时,它将使用luids而不是服务器正在使用的suid来弄脏服务器db。

我目前的解决方案是让主服务器记录路由到suid(每个客户端ID)和命令中每个外键的映射,查找该特定客户端的suid并使用suid代替

我想知道其他人遇到过这样的问题,如果是这样,他们是如何解决的?有更有效,更简单的方法吗?

我看了一下这个问题“将一个或多个数据库与主数据库同步 - 外键(5)”,有人似乎建议将我当前的解决方案作为一个选项,使用suids和自动递增序列组合键,使用另一个选项-ve id用​​于客户端ID,然后使用suid更新所有负ID。这两个选项似乎都有很多工作要做。

谢谢,

斋门

2 个答案:

答案 0 :(得分:0)

根据我的经验,采用组合方法最简单,特别是在调试问题和回滚的潜在需求方面,即了解哪些请求来自哪台机器并导致哪些更改真的很有帮助。每当你有效地处理多对一时,你必须有办法有效地隔离所有这些,当你有两个“非”发送更新非互补时,它还允许你进行更智能的冲突管理。 (如果你想做那样的事情)。

答案 1 :(得分:0)

我刚刚想到了另一种可能性:

在客户端分配路由时,请保留该路由的所有分配的映射,例如

像(json)这样的东西:

  {
   'luid123': [{model: list, attribute: 'id'}, 
             {model: todo, attribute: 'list_id'}]
  }

当我们从服务器获取全局luid2suid映射时(在同步之后),对于每个luid,我们在luid映射中查找luid并为每个条目更新相应模型中相应属性的guid,然后删除luid映射的条目。

您怎么看?

这样我就可以避免在全局luid2suid映射中为命令同步的所有外键执行昂贵的查找。另一个好处是外键也是客户端上的suid,我只需要从服务器端的luids中查找suid,以便在同步回服务器之前创建和修改脱机记录。

这只是一个想法,刚刚突然出现在我脑海中。我仍然希望有关该主题的更多反馈