0

我有一个中央数据库和一个独特的数据库为我正在处理的项目。中央数据库允许我为用户提供默认选项和数据。如何避免主键冲突时合并两个相同的表与视图

独特的数据库中心数据库结构相匹配,让用户自己定制的数据。我认为联合每个相同的表对。

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

这意味着我不能将两个表都设置为自动递增,其基数为0,因为主键在独特的数据库表中用作“外键”(我知道它们在此实例中不是严格的外键)。

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

我曾经想过在1000000什么设置独特的数据库PK基数,但当全球数据库(0基地)赶上这最终可能会在我身上适得其反。

我也尽管在视图中用数字前缀,例如,

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

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

不确定最佳方法?

+1

只要确保在每种情况下使用的数字范围足够大。一个INT的上限超过20亿,如果这还不够,你可以使用一个数据库从零递减的负数,另一个从零递增的正数。如果仍然不够,则使用BIGINT或NUMERIC。 – sqlvogel

+0

我喜欢这个消极的选择,在这个例子中,我会继续这样做!干杯! – Oliver

回答

0

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

人们有时候会使用GUID的候选键解决这个问题。通过这种方式,您的源数据库将IDENTITY列作为PK,并且也是唯一但不是源数据库中的主要GUID。然而,在合并的视图中,PK是GUID,并且带有原始源密钥(IDENTITY),但实际上并未在PK/FK关系中使用。

在这种类型的模型中,合并视图通常还包含某种源代码列,告诉您该行来自哪里。如果您这样做,那么源代码+身份密钥也是合并视图中的候选键。

0

事实正好有另外的想法:

我可以设置独特的底座1个增量2和全球基地2增量2.通过这种方式,没有疯狂的黑客和PK的永远不会发生冲突