資料遷移系統的比選

資料遷移系統的比選

資料遷移系統的比選

資料模型在開發過程中往往會發生變化,到了某個時候就不再對應資料庫了。 當然,可以刪除資料庫,然後ORM將創建一個與模型匹配的新版本,但這個過程會導致現有資料的遺失。 因此,遷移系統的功能是確保在模式變更時與應用程式中的資料模型同步,而不會遺失現有資料。

在本文中,我們將了解用於管理資料庫遷移的各種工具。 我們希望這篇評論對面臨類似選擇的開發人員有用。

任務

我們公司目前正在積極開發下一代產品—Docs Security Suite (DSS)。 伺服器部分採用.Net Core編寫,並使用Entity Framework Core作為DBMS。 在設計應用程式時,我們使用“程式碼優先”方法。

應用程式域模型由多個開發人員同時創建 - 每個開發人員負責自己的系統邏輯部分。

上一代DSS使用經典的Entity Framework Migrations(EF 6)作為遷移管理系統。 然而,針對它的一些抱怨已經累積起來,主要的抱怨是 EF 缺乏解決版本衝突的明智方法。 在修復錯誤作為支持的一部分時,這一事實仍然讓我們感到不安,因此我們決定考慮其他選擇。

經過討論,形成了遷移管理系統的以下需求:

  1. 支援各種 DBMS。 需要 MS SQL Server、PostgreSQL、Oracle,但也可以使用其他
  2. 使用 ORM。 最初計劃使用 EF Core,但在設計階段我們準備考慮其他 ORM
  3. 自動產生遷移。 考慮到Code First的開發,我希望避免需要「手寫」遷移
  4. 版本衝突。 在分散式開發環境中,合併時,EF Core 可能會出現衝突。 這成為一個嚴重的問題,因為應用程式的不同部分是由不同的開發人員創建的,因此您必須在每個部分上花費大量時間
  5. 高級文件和支援。 在我們看來,這裡不需要解釋
  6. 自由的。 這個標準是有條件的,因為系統不是很昂貴或昂貴,但在便利性方面是理想的,我們也準備考慮

經過一些研究,發現以下選項值得考慮:

  1. EF Core 遷移
  2. 資料庫備份
  3. 圓屋E
  4. ThinkingHome.Migrator
  5. 流暢的遷移器

現在有更多細節

資料遷移系統的比選
EntityFramework 核心遷移

自然,這是第一個也是主要的選擇。 一種原生樂器,開箱即用,無需擺弄手鼓。 大量的文件、官方的與非官方的、簡單性等等。 然而,對經典 EF 的抱怨也與 EF Core 有關。

因此,EF Core 的優勢就凸顯出來了:

  • Microsoft 支援、文件(包括俄語)、龐大的社區
  • 基於CodeFirst自動產生遷移
  • 與 EF 6 相比,EF Core 不再儲存資料庫的快照。 在 Code First 中使用 EF Core 時,不再需要部署資料庫
  • 由於我們從 Code First 開始,因此可以對所有必需的資料存取提供者進行一次遷移
  • 關於提供者,支援 PostgreSQL、支援 Oracle 等等,甚至還支援 MS SQL Server 

還有缺點:

  • 衝突解決保持在同一水平。 有必要對遷移進行排序並更新資料庫快照
  • 對生成遷移的模型的依賴性

資料庫

資料遷移系統的比選
dbup.github.io

DbUp 是一個由 NuGet 安裝的 .NET 函式庫,有助於將變更推送到 SQL Server。 它會追蹤已執行的更改腳本並運行更新資料庫所需的腳本。 函式庫源自 ASP.NET 上的一個開源部落格引擎項目,並在 MIT 許可下存在,程式碼位於 GitHub 上。 使用 T-SQL 描述遷移。

有什麼優點:

  • 支援大量 DBMS(MS SQL Server、PstgreSQL、MySQL)
  • 由於腳本是用 T-SQL 編寫的,因此看起來非常簡單
  • 衝突也可以使用 SQL 解決

以及缺點:

  • 支援的 DBMS 多種多樣,但 Oracle 並不是其中之一
  • 不與 ORM 交互
  • 手動編寫 T-SQL 腳本並不是我們的目標
  • 文件和社群馬馬虎虎,儘管就編寫 SQL 腳本而言它們可能不是必需的。

圓屋E

資料遷移系統的比選
github.com/chucknorris/roundhouse

與前一個遷移管理工具一樣,該遷移管理工具在 Apache 2.0 授權下分發,在 T-SQL 遷移引擎上運作。 顯然,開發人員優先考慮解決有關 DBMS 支援的技術問題,而不是創建舒適的開發流程。

優點:

  • 支援必要的DBMS(包括Oracle)

缺點:

  • .NET Core 不支援 Oracle(以及 Access,這與我們無關),僅支援 .NET Full Framework
  • 不適用於 ORM
  • 文件比以前的工具還要少
  • 再次強調-遷移是由腳本編寫的

ThinkingHome.Migrator

資料遷移系統的比選

用於將版本化資料庫架構遷移到 .NET Core 平台的工具,根據 MIT 授權分發。 開發者本人大約一年前寫了關於其最新版本的文章.

優點:

  • 專為 .NET Core 設計
  • 實作了遷移的分支序列
  • 實施遷移日誌記錄

缺點:

  • 上次更新是在一年前。 顯然該項目不受支持
  • 不受 Oracle 支援(文章指出這是由於 .NET Core 缺乏穩定的實現 - 但這是一年前的事了)
  • 沒有自動產生遷移

總體而言,該項目看起來很有前途,特別是如果它要開發的話,但我們現在需要做出決定。

流暢的遷移器

資料遷移系統的比選
github.com/ Fluentmigrator/fluencemigrator

最受歡迎的遷移工具,擁有大量粉絲。 根據 Apache 2.0 許可證分發。 如描述中所述,它是.NET 的遷移框架,類似於 Ruby on Rails 遷移。 對資料庫架構的變更在 C# 類別中描述。

這裡有以下優點:

  • 支援所需的 DBMS
  • .NET 核心支持
  • 大型已開發社區
  • 遷移之間的衝突依序解決-指定遷移的執行順序。 此外,如果一個實體出現衝突,則在合併程式碼時,將以與其餘程式碼相同的方式解決衝突
  • 成功遷移後會執行一些設定檔。 而且可以承載服務功能,最後一次更新是一個月前,也就是專案存活了

至於缺點,它們是:

  • 沒有自動產生遷移
  • 與 EF 型號無連接
  • 沒有資料庫快照

我們的選擇是什麼?

資料遷移系統的比選

激烈的爭論圍繞著兩個參數——自動生成遷移和合理解決衝突。 其他因素就沒那麼可怕了。 結果,根據討論的結果,團隊決定在新專案中使用Fluent Migrator。 因為解決了未來的矛盾會帶來更多的好處。

發現

當然,沒有完美的工具。 所以我們必須優先考慮我們的「想要」才能做出選擇。 然而,對於其他團隊和其他任務來說,其他因素可能是決定性的。 我們希望這篇文章能幫助您做出選擇。

來源: www.habr.com

添加評論