我的问题:
如何同步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的结构是相同的)
例如:
数据库信息:
每个用户都有多次访问,插件。
每次访问包含1个用户作为patient_id,1个用户作为doctor_id
每个插件都有一个用户,多个输入
plugin_inputs有一个插件
我在服务器上有2个数据库1,在本地托管其他数据库 - 用于离线模式 -
我想要的是能够将本地数据库与在线数据库同步,但由于我有超过1个用户,不止一个本地数据库,因此每个人将拥有几乎相同的ID,而在线数据库应该包含所有这些数据。
那么如何将它们同步?
我用户php / mysql(在线)/ sqlite(本地)
答案 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相同。