【发布时间】:2011-11-12 23:08:55
【问题描述】:
我正在设计一个需要支持复制的新数据库,但我一直在决定选择什么作为我的主键。
在我们当前的主键数据库中,我们使用两个 int 列,第一列是标识,另一列用于描述在哪个服务器上插入行。现在我想避免使用两列作为主键,而只使用一列。到目前为止,我有两种方法:
-
为我的主键使用 GUID
这将确保在任意数量的服务器上始终存在唯一的密钥。我不喜欢这个,GUID 的大小是 16 字节,当用于跨多个表的外键时,它会浪费空间。而且写查询的时候用起来比较麻烦,查询起来也比较慢。
使用 int 或 bigint,并为每个服务器上的每个表手动指定种子和增量值。例如,如果有两台服务器,第一台服务器上的 X 表将从编号 1 开始,而在第二台服务器上,它将从编号 2 开始,每个服务器都将递增 2。所以会有 (1,3,5,. ..) 在第一台服务器上,(2,4,6,...) 在第二台服务器上。这种设计的好处是在编写查询时更容易使用,速度很快,并且为外键使用的空间更少。糟糕的是,我们永远不知道将运行多少台服务器,因此很难判断增量值是多少。此外,管理服务器上的架构更改也更加困难。
管理多台服务器的最佳做法是什么?在这种情况下,最好的方法是什么?
【问题讨论】:
-
但是即使两个
int字段仍然只有 8 字节(而不是 GUID 的 16 个字节)....另外:两个int比 GUID 更好的集群键 - @987654321 @ -
另一种选择是使用复合键,一列用于服务器,另一列用于服务器特定的 int。 (一个 GUID 是 16 个字节;没有一个字节被浪费。你也许可以想出一个更小的键,但这并不意味着 GUID 是浪费的。它只是比每个更窄的键宽一点。浪费在这里只是一个不好的词,因为它限制了你的思维。)
标签: sql-server primary-key identity