跨服务器管理身份/主键

Mla*_*vić 8 sql-server identity primary-key

我正在设计一个需要支持复制的新数据库,而我却决定选择什么作为我的主键.

在我们当前的主键数据库中,我们使用两个int列,第一列是identity,另一列用于描述插入行的服务器.现在我想避免为主键使用两列,而只是使用一列.到目前为止,我有两种方法:

  1. 对我的主键使用GUID

    这个将确保在任意数量的服务器上始终存在唯一密钥.我不喜欢这个,是GUID是16字节大小,当用于跨越许多表的外键时,它将浪费空间.在编写查询时也很难使用它,查询速度会慢一些.

  2. 使用int或bigint,并为每个服务器上的每个表手动指定种子和增量值.例如,如果有两台服务器,第一台服务器上的X表将从1号开始,第二台服务器上的X表将从2号开始,每台将增加2.因此会有(1,3,5,...) ..)首先,和(2,4,6,...)在第二台服务器上.这种设计的好处在于它在编写查询时更容易使用,速度快,而且外键使用的空间更少.不好的是,我们永远不知道将运行多少台服务器,因此很难说出增量值是多少.此外,在服务器上管理架构更改也更加困难.

管理多个服务器的最佳实践是什么?如果出现这种情况,最好的方法是什么?

Bry*_*yan 0

更新:

在这里找到了更简单/手动的方法。正如您在评论中提到的,涉及使用NOT FOR REPLICATION和惊人的身份种子值。

原来的:

您最好的选择是类似于列出的第二个选项。为复制发布者和订阅者实例分配标识范围,然后打开自动范围管理。

本文讨论在复制中管理标识列的选项,并在此处讨论启用标识范围管理。

由于您不知道复制池中有多少台服务器,因此您可能需要定期重新配置项目属性。