2017-03-16 115 views
1

具有相同结构的操作数据库可在多个国家/地区使用。生成跨多个数据库唯一的主键

country A has table Users with column user_id 
country B has table Users with column user_id 
country C has table Users with column user_id 

当从所有三个数据库中的数据被带至暂存区用于进一步数据仓库目的的所有三个业务表被集成到具有dwh_user_id单个表的用户。

逻辑看起来像下面:

if record comes from A then dwh_user_id = 1000000 + user_id 
if record comes from B then dwh_user_id = 4000000 + user_id 
if record comes from c then dwh_user_id = 8000000 + user_id 

我有一个强烈的感觉,这是一个非常糟糕的做法。什么是更好的方法? (user_id + country_iso_code也许?)

+2

我会添加两列:国家和一个新的唯一ID。 –

+0

你在说什么是Master Data Management。 'CountryCode + to_char(user_id)'是一种方法。虽然对使用字符串主键有多重意见。另一种方式是可以使用代理键作为DWH_USER_ID并添加2列,一列用于国家代码,另一列用于user_id。 – Utsav

+0

任何固定长度的键都会有这种感觉,即分配的范围不够,记录会溢出到下一个范围。您可以决定数据库中是否存在这种可能性,如果是这样,您可以增加范围直到感觉良好,或者使用带有分隔符的可变长度键。 – GSerg

回答

1

通常,以这种方式向您的主键注入逻辑是一个可怕的想法。它真的让你失败 - 如果国家A的用户记录超过400万,该怎么办?

有多种解决方案。

理想情况下,您需要在所有表格中包含“country”列,并将其与ID一起用作主键。这使主记录和国家记录之间的逻辑保持一致。

如果您正在使用遗留系统并且无法修改国家/地区表格,但可以修改主表格,请在该处添加密钥,在加载期间填充该密钥,并将国家和ID组合作为主键。

0

我们在Ajilius中处理此方案的方式是向元数据添加元数据列。像SERVER_NAME或DATABASE_NAME这样的值可能会提供足够的唯一信息来使复合密钥具有唯一性。

另一种方案是在提取或加载时为每行生成一个GUID,然后唯一标识每行。

数据保险箱人员喜欢在整行上使用散列,但在这种情况下,只有在没有行是完整副本的情况下才能工作。

0

这就是他们制作Uniqueidentifier数据类型的原因。请参阅here

如果你不能改变这一点,我会把每个人放在不同的表中,然后将它们合并到一个视图中。喜欢的东西:

create view vWorld 
as 
select 1 as CountryId, user_id 
from SpainUsers 
UNION ALL 
select 2 as CountryId, user_id 
from USUsers 
0

最有效的方式做到这将是: -

If record from Country A, then user * 0 = Hence dwh_user_id = 0. 

If record from Country B, then (user * 0)- 1 = Hence dwh_user_id = -1. 

If record from Country C, then (user * 0)+ 1 = Hence dwh_user_id = 1. 

暗示这种逻辑假设dwh_user_id应该是一个数字字段。