1

我的问题 :

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

问题是数据库是关系型的,并且 id 一如既往地自动递增,所以如果我只是使用插入同步它会弄乱我的推荐人。

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

表的例子。

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 不一定在中央数据库和本地数据库之间匹配,但两者上的数据库结构是相同的)

例子: 我的主数据库比这个更复杂,但这应该作为一个例子

数据库信息:

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

  2. 每次访问都包含 1 个用户作为患者 ID,1 个用户作为医生 ID

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

  4. plugin_inputs 有一个插件

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

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

那么我怎样才能将它们同步在一起呢?

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

4

3 回答 3

1

您可以做几件事。

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

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

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

于 2013-02-11T16:29:55.053 回答
1

我很想重新设计应用程序架构,在“远程”端有一个 API,在“本地”端有一个在每天结束时运行的作业,以将所有“本地”数据发布到“远程” API。

这样,您可以让“本地”作业创建类似于以下内容的 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 消息,重建关系并将它们相应地插入“远程”数据库。

于 2015-02-10T22:10:42.710 回答
0

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

于 2020-03-11T15:27:09.603 回答