Mysql同步关系数据库

时间:2013-02-11 13:07:23

标签: mysql database synchronization relational-database

我的问题:

如何同步2个mysql数据库(离线本地数据库与主在线数据库)?

问题是数据库是关系型的,并且id一如既往地是自动递增的,所以如果我只是使用insert进行同步,那么就会弄乱我的侮辱。

  

这是我所做的诊所管理应用程序,问题是目前的问题   服务器,但有时互联网连接下降/慢速我的用户   诊所,所以我需要让他在离线模式下工作(存储所有东西   到本地数据库)和手动同步(双向)远程数据库   在一天结束时。   所以基本上每个诊所都应该有自己的本地数据库,并让它们全部同步到中央数据库

表格的例子。

db.Cental.users

|id|user|clinic  |
|01|demo|day care|
|02|nurs|er      |
|03|demX|day care|

db.day care.users

|id|user|clinic  |
|01|demo|day care|
|02|demX|day care|

(注意id在中央和本地数据库之间不一定匹配,但两者上db的结构是相同的)

例如: my main database is more complex than this one, but that should do as an example

数据库信息:

  1. 每个用户都有多次访问,插件。

  2. 每次访问包含1个用户作为patient_id,1个用户作为doctor_id

  3. 每个插件都有一个用户,多个输入

  4. plugin_inputs有一个插件

  5. 我在服务器上有2个数据库1,在本地托管其他数据库 - 用于离线模式 -

    我想要的是能够将本地数据库与在线数据库同步,但由于我有超过1个用户,不止一个本地数据库,因此每个人将拥有几乎相同的ID,而在线数据库应该包含所有这些数据。

    那么如何将它们同步?

    我用户php / mysql(在线)/ sqlite(本地)

3 个答案:

答案 0 :(得分:1)

你可以做几件事。

首先,您可以考虑用户表的复合主键 - 例如,您可以在主键中包含“Clinic”。这样,您就知道即使自动增量值重叠,您也可以始终唯一地标识用户。

然后,“访问”表需要在外键中包含patient_clinic和doctor_clinic。

或者 - 并且更脏 - 您可以简单地为每个诊所设置自动增量字段以不同的数字开始:ALTER TABLE user AUTO_INCREMENT = 10000;将用户表的第一个auto_increment设置为10000;如果下一个诊所将其设置为20000(或其他),您可以避免重叠(直到您超过该幻数,这就是为什么它很脏)。

答案 1 :(得分:1)

我很想重新设计应用程序架构,以便在" remote"结束,并在每天结束时在本地"本地"结束发布所有" local"数据到"遥控器" API。

这样你可以拥有" local" job创建类似于此的JSON消息:

{ user_visit: 
    { 
      user_id: 1, 
      doctor_id: 1, 
      plugins: [
          {
          plugin_name: name,  
          data: {
              data_field1: "VALUE",
              data_field2: "VALUE2",
              data_fieldxx: "VALUExx"
          }

      ]
    }
}

并将每封邮件发送给API。在API中,您将迭代JSON消息,重建关系并将它们插入到" remote"相应的数据库。

答案 2 :(得分:0)

在本地数据库中创建“ id”和“ id_offline”列。使用“ id_offline”在表之间建立所有关系,并使用自动递增。 “ id”将匹配MySQL的“ id”,并以空值开头。 将数据发送到服务器时,将检查“ id”是否等于null,如果不是,则“ insert”,如果不是“ update”,则使用MySQL“ RETURNING”函数返回自动生成的值。 id并将此信息返回给发出请求的设备。 当设备收到新的ID时,将本地数据库的“ ID”列更新为与MySQL相同。