我正在权衡可用于多主复制的整数主键的选项。 (我几乎使用整数键代替GUID销售)
我能想到的最好的方法是先获得最重要的数据并将服务器号码放在最后: 例如。服务器1上的发票1 = 101 服务器2上的发票1 = 102 其中non serverno part(invoiceno)来自db number generator
算法:gen_id(INVOICENO_GEN,1)* 100 + serverno 你可以通过查看数值和数学来获得服务器编号。
为99台服务器留出空间,同时仍然短而易读且不会发生冲突。使用该方案和普通的整数大小列将产生最大行数(21 474 836)或者如果bigint使用了数十亿。
例如发票表键如下所示:
Server 1
101
201
301
401
Server 2
102
202
302
402
所以我的问题是:我忽略了任何批评或瑕疵?
数据库是Firebird。
答案 0 :(得分:2)
如何创建复合主键?
定义要在每台服务器上设置的“ServerID”,例如作为INT的1,2,3,4等。然后在发票表上将“InvoiceID”作为INT。
创建主键(ServerID,InvoiceID)。
这样,你有超过99台服务器的空间,你不必操纵/计算任何ID或类似的东西。
当然,任何引用您的Invoice表的表现在都需要使用(ServerID,InvoiceID)作为外键 - 但我想如果您需要在表中的任何地方使用ServerID都不会成为问题也复制这些表格。
马克
答案 1 :(得分:2)
通常,不会将数字类型用于任何非数字的内容。处理具有特殊意义的数字会使您的数字不再是严格数字。字符串通常更适合于这样的场景,您希望添加一些特定于环境的数据(通常用于复制)。