我正在设计一个新的数据库,需要支持复制功能,但我卡在了选择主键的决定上。
我们目前的数据库使用两个int列作为主键,第一列是自增列,另一个用于描述插入该行的服务器。现在我想避免使用两个列作为主键,而只使用一个列。到目前为止,我有两种方法:
使用GUID作为我的主键
这将确保任何数量的服务器上都有唯一的键。我不喜欢这种方法的原因是GUID占用16字节的空间,在跨多个表的外键中使用时会浪费空间。同时在编写查询时使用它更加困难且查询速度较慢。
使用int或bigint,并手动为每个服务器上的每个表指定种子和递增值。例如,如果有两个服务器,则第一个服务器上的X表将从1开始,第二个服务器上的X表将从2开始,每个表的递增值都为2。因此,第一个服务器上将有(1,3,5,...),第二个服务器上将有(2,4,6,...)。这种设计的好处是编写查询时更容易使用,速度快,外键使用的空间更少。坏处是我们永远不知道将运行多少服务器,因此很难确定递增值。此外,在服务器上管理模式更加困难。
在管理多个服务器时,有什么最佳实践?在这种情况下,是否有最佳方法?