Sql server 转移一个特定的webapp用户';将数据转移到另一个DB实例上而不发生PK冲突?

Sql server 转移一个特定的webapp用户';将数据转移到另一个DB实例上而不发生PK冲突?,sql-server,database,web-applications,architecture,uniqueidentifier,Sql Server,Database,Web Applications,Architecture,Uniqueidentifier,已编辑 几年前,当我们第一次设计web应用程序时,我们为所有用户的数据选择了自动增量int。然而,我们现在被将特定用户的数据(具有一对多关系的多个表)传输到另一个非空数据库实例(具有相同的表结构)的难度所折磨 虽然SET IDENTITY_INSERT table ON | OFF可能适用于某些表,但在我们当前的体系结构中,我们仍然会遇到问题,因为“一对多”关系中的某些“多”可能会与目标数据库冲突 受Pam Lahoud下面回答的启发,我开始研究非集群PK和PK替代方案。然后我遇到了MSDN,“

已编辑

几年前,当我们第一次设计web应用程序时,我们为所有用户的数据选择了自动增量int。然而,我们现在被将特定用户的数据(具有一对多关系的多个表)传输到另一个非空数据库实例(具有相同的表结构)的难度所折磨

虽然
SET IDENTITY_INSERT table ON | OFF
可能适用于某些表,但在我们当前的体系结构中,我们仍然会遇到问题,因为“一对多”关系中的某些“多”可能会与目标数据库冲突


受Pam Lahoud下面回答的启发,我开始研究非集群PK和PK替代方案。然后我遇到了MSDN,“包含节点标识符的密钥”引起了我的注意。有人有过这种体系结构的经验吗?

作为主键的guid非常棒,而作为聚集索引键的guid则没有那么棒。虽然PK默认为集群,但不一定非要集群。如果表中有另一个列是有意义的,则可以考虑转换为非聚集的GUID主键,并在其他字段上进行聚类。 如果表中的PK经常用于过滤和连接,那么即使它们是GUID,对它们进行集群也是有意义的。使用newsequentialid()可以解决大多数由GUID聚集索引键引起的问题,即逻辑索引碎片、页面拆分和页面密度低。您仍然存在这样一个问题,即guid是一种大型数据类型,因此您的所有索引(包括集群索引和非集群索引,因为它们还包含集群索引键)都会稍微大一些,但我认为这不一定会破坏交易

除了转换为guid之外,我能想到的唯一其他解决方案是在每个数据库上指定标识范围,并添加约束以确保它们之间的范围没有重叠。这当然不适用于现有数据,但可以防止问题在将来发生,因为插入的新数据在整个场中应该是唯一的


与SQL Server中的任何内容一样,很少有“始终”或“从不”规则,作为主键和/或聚集索引键的GUID是“视情况而定”规则之一,我认为在这种情况下,GUID PK可能是正确的解决方案。

我真的不明白您是如何被烧坏的。请解释你的困难。几乎所有现代DB/ORM都支持自动递增键,这应该没有问题。@FractalizeR的guid为pk,我们可以将记录按原样插入到新的DB中,而无需重新设置关系数据的pk/fk。对于自动递增整数,我们很可能必须先插入它们,然后适当地设置fk?我希望您先澄清PK和fk代表什么。那么PK是主键?FK是外键吗?我以前先用ASCII格式传输数据。无法给你一个详细的答案来解释为什么它在过去对我来说似乎在一个普遍的层面上更有效,但是数据传输更加轻松和完整。我假设这取决于您希望传输的数据类型。我希望我的回答能帮助你完成项目。我也不认为传输pk/fk有问题。你还是把桌子分开吧。你的问题不清楚。如果要将数据库传输到具有相同或更高版本的SQL Server的另一个实例,只需执行标准备份,然后执行标准还原。它将保留您拥有的所有ID。如果“迁移”的意思不同,请在问题中解释。如果是数据的单向同步,则只需在同步期间使用,并保留PK和FK的所有值。在这种情况下,您不需要重新分配任何内容。所以,我没有看到任何技术问题。如果你需要做一些不同的事情,请在问题中澄清。如果您不想或不能使用
设置标识\u INSERT
,请在问题中说明原因。仅部分同步数据时int ID之间的间隙?guid之间也有随机的间隙,所以我不认为这是一个参数。结合对
SET IDENTITY\u INSERT
的讨论,大部分内容都涵盖了。谢谢@PamLahoud,您对“包含节点标识符的键”怎么看?我正在评估这种方法,2 int复合键会打败guid吗?与SQL Server中的任何问题一样,正确的答案是“这取决于”:)我认为2 int复合键也是一个很好的解决方案。2个int比1个GUID小,因此您可以这样做,但我认为,转移到两列解决方案的开发工作可能比更改单个列的数据类型更大。从数据库的角度来看,我觉得2列解决方案的唯一优势是数据大小,除非您查询ID的范围,否则newsequentialid()可以减轻GUID的所有其他方面。考虑到这一点,我认为您需要查看应用程序代码以确定哪一个是最好的。您的查询是否需要考虑此新站点ID?是否需要将其添加到WHERE子句中,或者您是否有可以有效忽略它的本地代码?这将对您的索引策略产生什么影响?这只是一些我想考虑的事情。羞耻并不是两个答案,因为我投票否决了GUID键,增加了投票的身份范围。我曾经对一个数据库做过这样的操作,该数据库是在大约120个SQL Server Express数据库和一个企业主数据库之间复制的,用于一个包含400000000行的表。身份范围工作得相当好,只是确保范围不会填满!考虑使用双关语来帮助。