2015-07-21 43 views
3

我正在开发一个存储软件,其中MySQL和PHP本地数据库将同步到联机数据库。如何在联机和本地MySQL数据库同步时创建主键

假设我有一个表卖,sell_id是表的主键。我通常使用INT和主键自动增量。

本地数据库1卖出表具有2条目(sell_id 1,2)和本地数据库2卖出表具有2条目(sell_id 1,2)。

如果我将这两个本地销售表条目同步/插入到在线销售表中,它将变为(sell_id 1,2,3,4)。

由于出售ID变化,它会影响其他表中使用sell_id作为外键的其他表中的条目。

enter image description here

我应该如何计划建立在这种情况下主键。

我打算使用字母数字 id,这对于两个数据库都是唯一的。它会创建任何问题或进一步减慢我的数据库查询数百万的sell_id?

enter image description here

是否有任何其他方式来解决这个问题?

+0

使用过程来选择要从本地数据库导入的所有内容,然后将ID更改为新的sell_id并进行正确的插入。或者创建一个触发器来更改所有的sell_id的 – nada

+0

如果你的主键是一个INT或CHAR,那么不应该有太大的差别,性能方面,尽管有一些带有'VARCHAR'和'MyISAM'表的弱点,但是什么也没有太可怕了。你最大的问题可能是首先产生这个价值。 – CD001

+0

您可以有一个额外的列标识客户端,并使用作为主键。这样你就会知道一个给定的元组从哪里来。但是我不清楚这些元组是否可以引用相同的* object *;在这种情况下,您可能需要与SKU等效的东西。对于购买等,应该工作。对于客户,您还需要某种双向同步。 – LSerni

回答

1

这太长了评论。

通常,当您拥有复制系统时,目标是在所有服务器上保持相同的数据。这似乎不是您的业务需求。

相反,您可能会考虑在所有服务器上使用复合主键。这会将自动递增的主键与服务器ID结合起来。所有引用外键的表都需要包含“服务器”列和“id”。

一般来说,我不是复合主键的粉丝。但是,您有一个分布式数据库,需要识别数据所在的特定数据库“分区”。这似乎是复合主键的一个很好的用例。

另一种方法 - 如果你愿意承担风险 - 就是在每台服务器上将自动编号设置为不同的起始值。对于一台服务器使用大的整数和大的值,例如1,000,000,000,000,对于下一个等2000,000,000,000。然而,我的首选是将“服务器”明确地表示为一列。

+0

我喜欢这里的复合键方法;如果/当一个新服务器被添加到“集群”(不是真的是正确的词,但我现在想不到一个更好的服务器)时,只需确保它在所有系统中都可以被复制。 – CD001

相关问题