2017-03-16 124 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應該是一個數字字段。