如何在将两个相同的表与视图合并时如何避免主键冲突

时间:2011-08-18 08:39:48

标签: database sql-server-2008 database-design relational-database

我有一个中央数据库和一个我正在处理的项目的唯一数据库。中央数据库允许我为用户提供默认选项和数据。

唯一数据库与中央数据库结构匹配,以允许用户拥有自定义数据。我有意见,联合每个相同的表对。

每个视图中的“主键”字段被设置为我正在使用的dbml(Linq-to-sql)中的主键。然后我将关联添加到dbml中的其他表。

这意味着我不能将两个表都设置为以0为基数进行自动递增,因为主键在唯一的db表中用作“外键”(我知道在这个实例中它们不是严格的外键)

因此,在视图中,我需要每个表对中的所有记录都具有唯一的主键。

我考虑过将唯一数据库pk基数设置为1000000或者其他东西,但是当全局数据库(0库)赶上时,这最终可能会适得其反。

我也想在视图中为每个人添加一个数字,例如

全球:11,12,13,14,15,16,17,18,19,110,111 独特:21,22,23,24,25,26,27,28,29,210,211

我担心这会在查询时如何影响性能,这必须尽可能高效。

不确定最佳方法?

2 个答案:

答案 0 :(得分:0)

实际上有另一个想法:

我可以设置唯一的基础1增量2和全局基数2增量2.这样,没有疯狂的黑客和pk永远不会发生冲突

答案 1 :(得分:0)

您的解决方案的一个问题是它很脆弱,如果您需要合并两个以上的来源,它会失败。根据您的业务情况,这可能是也可能不是现实风险。

人们有时会通过使用GUID作为候选键来解决此问题。通过这种方式,源数据库将IDENTITY列作为PK,并且还具有GUID,该GUID在源数据库中是唯一但不是主要的。但是,在合并视图中,PK是GUID,原始源键(IDENTITY)用于骑行,但实际上并未用于PK / FK关系。

在这种类型的模型中,合并视图通常还包含某种源代码列,用于指示行的来源。如果执行此操作,则源代码+标识密钥也是合并视图中的候选键。