有哪些选项可以将一个特定的 Web 应用程序用户数据传输到另一个数据库实例而不会遭受 PK 冲突?
What options are there for transferring one particular webapp user's data onto another DB instance without suffering PK collision?
已编辑
当我们几年前第一次构建我们的网络应用程序时,我们为所有用户的数据选择了自动增量 int。然而,我们现在对将特定用户的数据(具有一对多关系的多个 table )传输到另一个非空数据库实例(具有相同的 table 限制)的难度感到恼火).
虽然 SET IDENTITY_INSERT table ON | OFF
可能适用于某些 tables,但使用我们当前的架构,我们仍然 运行 会遇到问题,因为 'many' 在 'one-to-many'关系可能与目标数据库发生冲突。
受到下面 Pam Lahoud 的回答的启发,我开始研究非集群 PK 和 PK 替代方案。然后我从 MSDN 上看到 Selecting an Appropriate Primary Key for a Distributed Environment,"Keys That Include a Node Identifier" 引起了我的注意。有人有过这种架构的经验吗?
作为主键的 GUID 很棒,作为聚集索引键的 GUID 就没那么棒了。虽然 PK 默认是群集的,但不一定必须如此。如果 table 上还有另一列可以进行集群,您可以考虑转换为非集群 GUID 主键并在其他字段上进行集群。
如果您 table 上的 PK 经常用于过滤和加入,即使它们是 GUID,对它们进行集群可能仍然有意义。使用 newsequentialid() 将解决大多数由 GUID 聚集索引键引起的问题 - 即逻辑索引碎片、页面拆分和低页面密度。您仍然遇到 GUID 是一种大型数据类型的问题,因此您的所有索引(聚集索引和非聚集索引,因为它们也包含聚集索引键)都会更大一些,但我认为这不一定会破坏交易。
除了转换为 GUID 之外,我能想到的唯一其他解决方案是在每个数据库上指定标识范围并添加约束以确保它们之间的范围没有重叠。这当然不适用于现有数据,但可以防止将来发生此问题,因为插入的新数据在您的服务器场中应该是唯一的。
与 SQL 服务器中的任何内容一样,很少有 "always" 或 "never" 规则,作为主键的 GUID and/or 聚集索引键是其中之一 "it depends" 规则,我认为在这种情况下,GUID PK 可能是正确的解决方案。
已编辑
当我们几年前第一次构建我们的网络应用程序时,我们为所有用户的数据选择了自动增量 int。然而,我们现在对将特定用户的数据(具有一对多关系的多个 table )传输到另一个非空数据库实例(具有相同的 table 限制)的难度感到恼火).
虽然 SET IDENTITY_INSERT table ON | OFF
可能适用于某些 tables,但使用我们当前的架构,我们仍然 运行 会遇到问题,因为 'many' 在 'one-to-many'关系可能与目标数据库发生冲突。
受到下面 Pam Lahoud 的回答的启发,我开始研究非集群 PK 和 PK 替代方案。然后我从 MSDN 上看到 Selecting an Appropriate Primary Key for a Distributed Environment,"Keys That Include a Node Identifier" 引起了我的注意。有人有过这种架构的经验吗?
作为主键的 GUID 很棒,作为聚集索引键的 GUID 就没那么棒了。虽然 PK 默认是群集的,但不一定必须如此。如果 table 上还有另一列可以进行集群,您可以考虑转换为非集群 GUID 主键并在其他字段上进行集群。
如果您 table 上的 PK 经常用于过滤和加入,即使它们是 GUID,对它们进行集群可能仍然有意义。使用 newsequentialid() 将解决大多数由 GUID 聚集索引键引起的问题 - 即逻辑索引碎片、页面拆分和低页面密度。您仍然遇到 GUID 是一种大型数据类型的问题,因此您的所有索引(聚集索引和非聚集索引,因为它们也包含聚集索引键)都会更大一些,但我认为这不一定会破坏交易。
除了转换为 GUID 之外,我能想到的唯一其他解决方案是在每个数据库上指定标识范围并添加约束以确保它们之间的范围没有重叠。这当然不适用于现有数据,但可以防止将来发生此问题,因为插入的新数据在您的服务器场中应该是唯一的。
与 SQL 服务器中的任何内容一样,很少有 "always" 或 "never" 规则,作为主键的 GUID and/or 聚集索引键是其中之一 "it depends" 规则,我认为在这种情况下,GUID PK 可能是正确的解决方案。