2014-05-20 83 views
0

我正在爲每個客戶創建一個數據庫模式。所以,無論何時註冊新客戶,我都需要在運行時快速創建模式。數據庫遷移:單個創建腳本與更改集

選項1

在運行時,使用Liquibase(或同等)運行所有的變更生成最新的模式。

缺點:

  • 這是緩慢的,也可以是多個歷史變遷setsa現在是不相關的話(create table和一年後放棄它)。
  • Liquibase在運行時用於此處,而不僅僅是「遷移時間」。不知道這是不是一個好主意。
  • 將Liquibase作爲構建模式的一種手段,將迫使所有開發人員在開發過程中使用它。我們儘量避免向開發人員加載更多工具。

選項2

每個版本後,我們使用生成變更Liquibase臨時DB。然後從數據庫中創建一個基於當前快照的乾淨模式創建腳本。然後,當新客戶來到時,我們只運行乾淨的腳本,而不是完整的變更集歷史記錄。

缺點:

  • 下一次,我跑liquibase它會嘗試從變更1.運行一種解決方法可能是在生成腳本以包括變更表的創建,並插入到它的最新變更。
  • 使用一個腳本創建新模式,而舊模式經歷變更集過程。理論上這可能會導致不同的模式。但是,單個腳本也經歷了變更集過程,所以我不能想到會導致錯誤的確切情況,這是目前的一個理論問題。

您怎麼看?

回答

1

我會建議選項#1的一致性。

數據庫更新可能很複雜,變異的可能性越小越好。這意味着您應該讓開發人員創建liquibase changeSets,最初更新數據庫,因爲他們正在實施新功能以瞭解他們正在按預期運行,然後知道這些相同步驟將在QA中貫穿整個生產過程。這是他們需要處理的額外工具,但應該很容易以易於使用的方式將其集成到標準工作流程中。

同樣,我通常建議在changeLog中留下不相關的歷史changeSet,因爲如果刪除它們,您將偏離已知的更新路徑。數據庫對於大多數操作來說是快速的,特別是在數據很少或沒有數據的系統上。如果您有特定的changeSets不再需要,並且由於某種原因過於昂貴,您可以根據具體情況將其刪除,但我會建議這樣做很少。

如果您在快照中包含數據庫更新日誌表,那麼從liquibase腳本創建數據庫快照應該與運行changelog相同。但是,堅持使用實際的Liquibase更新到生產將允許您使用上下文,前提條件和更改日誌參數等功能,這些參數可能對您的案例有所幫助。

0

有數據庫部署兩種方法:

  1. 一次構建,多次部署 - 這種方法使用相同的原則,本機代碼,編譯一次,在整個環境中複製的二進制文件。從數據庫的角度來看,這種方法意味着部署腳本只生成一次,然後跨環境執行。

  2. 構建&按需部署 - 此方法在需要時會生成增量腳本,以處理任何過程更改。

如果您使用生成&部署按需方法,您可以生成整個架構或工作項目/變更三角洲腳本。