Migration
如何在“全代理”數據庫之間遷移數據?
需要定期執行此操作:
- 將生產數據庫中的數據插入測試/開發數據庫,以便程序員有新的數據進行測試。
- 無論出於何種原因,將數據從一個數據庫遷移到另一個數據庫。
注意:數據庫是關係型的。
問題是:
- 數據庫採用“所有 PK 都是代理”策略進行建模。
- 將數據從一個數據庫移動到另一個涉及程式以避免 PK 值(由序列生成)的衝突。
- 為了在代理鍵之間進行“等效”,需要一個將源數據庫表和目標數據庫表的 PK 值配對的表。
- 必須在遷移之前通過匹配業務密鑰(不是 PK,因此不要管理 FK)來創建所述表
- 與具有自然鍵的表相比,即使是單個表的數據遷移也不是微不足道的。
當所有表都有代理鍵時,將行從一個數據庫複製到另一個數據庫的最簡單方法是什麼?
我們不久前在工作中遇到了這個問題(或者至少是類似的問題),我們的解決方案是將遷移過程分為幾個步驟:
- 將新數據插入臨時登台表
- 更新臨時表中的代理鍵,以免發生衝突
- 將數據插入目標表
- 刪除臨時表
第二部分是棘手的部分,但在我們的例子中,我們能夠為每個表遵循這個算法:
- 如果此表有任何外鍵,請使用 ON UPDATE CASCADE 在臨時表中設置外鍵
- 將所有行的主鍵更新為新的 id 範圍。我們使用了否定的 ID。例如更新暫存表集 ID=-ID-1;現在在下一步中沒有身份衝突的風險。
- 現在,對於 STAGINGTABLE 中的每一行,生成並分配一個新的 id
對每個臨時表重複。處理完所有臨時表後,將數據插入到目標表中。
這依賴的一個假設是所有數據都是新的並且獨立於數據庫中已有的數據。