DWH

2017-06-04 64 views
1

我有PostgreSQL中的一個項目,以創建多個架構一個數據倉庫。模式具有相同的結構(表格,約束)。 我被困在這個問題上:我在DWH中使用的所有模式中都有一個表「employees」。 schema1表員工中的第一個條目是1 John Dow,schema2表員工中的第一個條目是1 Mary Jane(id列是自動增量)。 有沒有辦法用這種結構創建DWH?有沒有辦法對模式數據進行分區? 謝謝。DWH

+0

是否有任何理由不能簡單地將所有員工數據合併到一個表中,添加一個捕獲源模式名稱的字段(如果需要),然後爲每個數據分配一個新的ID記錄? – RADO

回答

0

最簡單的方法可能會分配一個號碼鍵的最顯著位,成爲源ID,從而使你的鑰匙在所有的源數據庫中是唯一的。例如。假設您將永遠不會有超過100個數據庫存儲,因此7位數據庫標識符就足夠了。

  1. 確保數據庫具有連續的整數主鍵或引用這些外鍵的表,使用相同的數據類型。該數據類型必須足夠大,以保存任何表上所有行的值,而不觸及最重要的8位。所以INTEGER(32位)的密鑰將留下剩餘的允許多達16777215個插入24位,並BIGINT(64位)的密鑰將離開56位剩餘,允許多達72057594037927935個插入。 (要注意的是ALTER TABLE ... ALTER COLUMN SET DATA TYPE需要一個完整的表重寫,並且可用於高容量的表非常慢。)
  2. 分配各個DB一個唯一的,7位數據庫標識符將佔據每個鍵的最顯著8位。你只能得到7位而不是8位,因爲最高位是簽名位,你不能觸及它。
  3. 對於數據庫中引用它的每個整數主鍵和外鍵,更新它,將DB_ID << 24(對於32位密鑰)或DB_ID << 56(對於64位密鑰)添加到它。例如。對於ID爲13和32位密鑰的數據庫,您應該爲每個密鑰值添加218103808。
  4. 任選地,添加CHECK CONSTRAINT s至每個表中,確保其關鍵是在範圍[(DB_ID << 24) + 1, ((DB_ID+1) << 24) - 1]
  5. 使用:ALTER SEQUENCE :seq_name MINVALUE :min_val MAXVALUE :max_val START WITH :start_val RESTART WITH :start_val重新啓動每個表的PK序列,其中min_val = (DB_ID << 24) + 1max_val = ((DB_ID+1) << 24) - 1start_val = currval(SEQUENCE_NAME)
+0

感謝您的回覆。我正在努力完成這項工作。再一次感謝你。祝你有美好的一天 ! – k4br4s

0

重新計算作爲

<id> * <# of schemas> + <schema number> 

例如主鍵,如果有三個模式中,從第一模式號7將成爲7 * 3 + 1 = 22,並且從第三模式號5將成爲5 * 3 + 3 = 18。

這樣,你可以很容易地在無碰撞的方式轉換所有的數字。

+0

謝謝你的迴應。我的問題是我的模式編號是動態的。它適用於應用程序,每當客戶註冊我們的帳戶時,應用程序都會爲該客戶端生成架構。 – k4br4s