生成跨多个数据库唯一的主键

时间:2017-03-16 16:24:29

标签: sql etl data-warehouse

相同结构的运营数据库在多个国家/地区开展工作。

executeBatch

当来自所有三个数据库的数据被带到临时区域以进行进一步的数据仓库时,所有三个操作表都集成到具有dwh_user_id的用户表中。

逻辑如下:

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

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

4 个答案:

答案 0 :(得分:1)

一般来说,以这种方式将逻辑注入主键是一个糟糕的主意。它真的让你失败 - 如果国家A获得超过4000000个用户记录会怎么样?

有多种解决方案。

理想情况下,您可以添加"国家/地区"在所有表中,并将其与ID一起用作主键。这使主记录和国家记录之间的逻辑保持一致。

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

答案 1 :(得分:0)

我们在Ajilius中处理此方案的方法是将元数据列添加到加载中。像SERVER_NAME或DATABASE_NAME这样的值可能会提供足够的唯一信息,以使复合键唯一。

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

数据保险库人员喜欢在行中使用散列,但在这种情况下,只有在没有行完全重复的情况下才能使用。

答案 2 :(得分: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

答案 3 :(得分:-1)

最有效的方法是: -

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应该是一个数字字段,建议这个逻辑。