Database 用于复制的整数主键

Database 用于复制的整数主键,database,replication,firebird,Database,Replication,Firebird,我正在权衡可用于多主机复制的整数主键选项。(我非常喜欢使用整数键而不是guid) 我所能想到的最好办法是先获取最重要的数据,最后获取服务器编号: 例如,服务器1上的发票1=101 服务器2上的发票1=102 其中,非serverno部分(invoiceno)来自db编号生成器 算法:gen_id(INVOICENO_gen,1)*100+serverno 你可以通过观察数值和数学计算得到服务器号 这为99台服务器留出了空间,同时仍然很短,可读性好,不会发生冲突。使用该方案和正常整数大小列将使最大

我正在权衡可用于多主机复制的整数主键选项。(我非常喜欢使用整数键而不是guid)

我所能想到的最好办法是先获取最重要的数据,最后获取服务器编号: 例如,服务器1上的发票1=101 服务器2上的发票1=102 其中,非serverno部分(invoiceno)来自db编号生成器

算法:gen_id(INVOICENO_gen,1)*100+serverno 你可以通过观察数值和数学计算得到服务器号

这为99台服务器留出了空间,同时仍然很短,可读性好,不会发生冲突。使用该方案和正常整数大小列将使最大行数(21474836)或者如果使用bigint,则会增加数十亿

例如,发票表键如下所示:

Server 1    
101
201
301
401

Server 2    
102
202
302
402
所以我的问题是:有没有我忽略的批评或缺陷?


数据库是Firebird。

创建一个复合主键怎么样

在每台服务器上定义一个要设置的“ServerID”,例如1、2、3、4等,作为INT。然后在发票表上将“InvoiceID”作为INT

创建要创建的主键(ServerID、InvoiceID)

这样,您就可以容纳超过99台服务器,而不必操纵/计算任何ID或类似的东西

当然,任何引用发票表的表现在也需要使用(ServerID,InvoiceID)作为外键——但我想如果您也需要复制这些表,那么在表中的任何位置都使用ServerID也不会有问题


Marc

一般来说,不要对非数字的东西使用数字类型。处理具有特殊意义的数字使您的数字不再是严格意义上的数字。字符串通常更适合这样的场景,即您希望添加一些特定于环境的数据(通常用于复制)。

我不想为此引入复合键。首先,复合键是一个需要处理的PITA,看起来他实际上对基于附加信息关联这些数据并不感兴趣。我们使用的大多数代码和库都是针对单个主键进行优化的。因此,从数据库的角度来看,复合主键是“正确”的答案,但从开发的角度来看,这并不好。我们没有invoiceno(没有serverno)列,因为这是我们想要打印在发票、查找等上的内容。实际上,我们并不打算在查询中使用嵌入的数字。这只是一种分离多个递增值的方法,类似于更改生成器的步进或开始。但您提出了一个很好的观点。将不得不做一些基准测试,看看一个整数主键是否真的是一个很大的增益。