Postgresql 資料庫 Migration 方案的選擇

更新於 2024/10/27閱讀時間約 7 分鐘
最近接獲一個任務,該任務的目標是替一個即將進入正式部署階段的系統,導入一個 database migration tool,以下是此任務整個思考決策的邏輯以及正式進行時技術上比較值得和大家分享的小細節。

系統背景

資料庫的設計方式,目前常見會有兩種方向,code first 以及 database first。
所謂的 code first 模式,是整個系統在發展初期即以程式碼為管理核心,直接在程式碼內撰寫商業邏輯所使用的 data model 然後再透過 migration 工具轉換為資料庫 schema。相反的,database first 模式則是以直接建立、修改資料庫 schema 的方式,來進行整個開發設計工作。
此任務則是使用 database first 模式。
系統的整體架構部分,此系統是由一個以 C# 撰寫的後端、 angularjs 2 撰寫的前端,以及一個以 python 來實作的人工智慧系統,三者架構而成。
人員則是三個次要系統都有專人來處理開發,整體架構如下:

database migration 是什麼

migration 類別
database migration 有兩種含義,第一種是不同資料庫系統間的系統搬移工作,例如將 Oracle Database 上的資料庫移轉到 Postgresql 上;第二種則是將開發中的資料庫部署到正式的環境上,我們今天和大家分析的這個案例的工作內容屬於第二種。而在規劃這類資料庫的移轉工作時,需要注意幾項重點:
  1. 如何進行資料庫的套用變更
  2. 資料庫的變更如何做版本控制
  3. 不同版本的資料庫如何與其系統程式碼的版本相對應
資料庫的套用變更常見有幾種方式可以選擇,一種是透過撰寫變更 db schema 的 sql 原始碼來完成,第二種則是可以透過 ORM 框架來自動將 data model 轉換為資料庫。
使用撰寫 sql 原始碼來進行資料庫的套用變更是一個最原始的方式,但是相對的,使用這個方式我們資料庫的版本控制以及資料庫與系統程式的對應記錄就需要全部人工處理,而使用 ORM 框架及其 migration 工具,則可以更方便的將上述三點以較輕鬆統一的方式,透過程式碼的管理來處理。
所以如果但就技術點來看,透過ORM框架來執行此項任務,通常會較統一簡單些。

migration 工具的選擇

然而在做決策時,也等同於在尋找最佳化解,而所謂的最佳化解,如果我們拉高決策時的高度,通常也不能只思考技術層面,而這份任務其實也算是蠻經典的,需要考慮更多層次因素的案例,下方則是此任務技術之外需考慮的其他層次問題。

人員配置的考慮

依照我們在系統背景段落的簡單介紹可知,這個系統主要有兩大服務(服務系統與智慧系統),三個子系統(智慧系統./服務前端/服務後端),而且由於這兩大服務在系統的比重大致相同,所以我們資料庫移轉工具選擇,可能有下方三種選項:
  • 以 C# 開發者為主要資料庫維護者,導入其生態上的 ORM 工具,例如 Entity Framework Core。
  • 以 python 開發者為為主要資料庫維護者,導入其生態上的 ORM 工具,例如 SQLAlchemy Migrate。
  • 繼續維持以資料庫原生的設計工具並且搭配各類 migration 工具來進行,
然而雖然在導入階段時,C# 開發者為其主要的資料庫維護者,但是顧慮到此系統隨時有可能轉換其資料庫的主要設計者,也就是保留人員調度的彈性,所以此 migration 導入的方向,則偏好維持以 database-first 的設計方式,而且希望能夠找到足夠簡單、低進入門檻、且最好是初期無購買成本的 open source 方案。
最後還有一個最無法改變的現狀是,本系統會部署在完全與 Internet 隔離的封閉環境。
綜合以上因素,最後 migration 工作的整體運作方案如下:

方案的定案

  1. 使用 Postgresql 資料庫,並且使用 pgAdmin 做為 db frontend 以及 schema 設計工具。
  2. 版本定版且開始準備移轉部署時,使用 migra(備註一) 來產生升版的 sql script。
  3. 以制度制度的定訂來進行版本控制,例如原始碼的版號搭配 sql script 的版號記錄。
  4. 將所有程式碼以及資料庫版本變更的 script 打包為 Docker image 來簡化部署。
  5. 部署到正式環境後,獨立的 flyway(備註二) container 將自動協助我們套用資料庫的版更 script。

執行細節

以下幾點是 migration 方案在執行時,一些比較值得注意的小細節,完整的工具使用方式請參考最後備註內的連結。
  1. migra 是一個很像 diff,可以協助我們產生兩個 postgresql schema 不同處分析的小工具。它最簡單的使用方法如下:
migra postgresql:///a postgresql:///b
像我們此次任務目標是要產生新版本 db schema 升版的 sql script,可以使用如下的指令
//# unsafe 是關閉不安全行為的提示
//# 注意 migration 之前一定要確認是否產生的 script 有沒有問題
migra --unsafe postgresql://{帳號}:{密碼}@{舊版資料庫網址}/{資料庫名稱} postgresql://{帳號}:{密碼}@{新版資料庫網址}/{資料庫名稱} migration.sql
其他的參數不在此贅述,請參考官方文件: Using migra directly
2. flyway 是一個可以幫我們自動偵測且套用 migration script 檔的一套工具,最重要的,它內部也會自行記錄變更記錄,來防止 migration script 的重複套用或者自動套用仍為變更的部分。

flyway 的安裝官方有提供多種方式,此案例使用的是 docker 來簡化安裝,最簡單的安裝指令如下:
docker run --rm flyway/flyway
另外官方 flyway docker 也定義了四個特殊意義的 volume:
  • /flyway/conf
    這目錄內預設存放 flyway.conf 這個設定檔
  • /flyway/drivers
    存放 jdbc driver 的目錄。(如果你選用的資料庫 flyway 沒有隨機附上的話)
  • /flyway/sql
    存放你的 db migration sql script 目錄。(如果你和本案例一樣,選擇以 sql script 做 migration 動作時)
  • /flyway/jars
    你打算讓 flyway 使用的 jar 檔的目錄。(如果你打算使用 java 來做 migration 動作的話)
你可以安裝你個人環境的需求來做進一步的調整,flyway 的其它細節請參考官方文件: flyway github
本案例的其他如 docker 部署以及版本控制的流程說明等已超過本次預設的分享範圍,如果您有什麼想法很歡迎留言討論。
又或者您有任何資訊顧問或者系統開發整合的需求,也歡迎您主動與我聯絡。
我的相關經歷與聯絡方式可以參考這裡:我的個人履歷

備註

  1. migra 工具官方程式碼
  2. flyway 官方 Docker hub image
為什麼會看到廣告
avatar-img
18會員
19內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Ted Chen的沙龍 的其他內容
【做就對了,不用想太多,令人驚喜的事情就會自己發生。】 就像,我想都沒有想過自己會站上料理台,教大家如何煮越南菜這件事。 這一陣子因為想讓自己完全放空,所以找了些一直以來都想做(學習速寫),或者只是單純不排斥的事情(試著料理)來讓自己空閒之餘接觸接觸。 一開始其實還著挺忙碌的,甚至因為怕自己偷懶,所
還記得第一次在越南某餐廳吃到這沾醬的驚艷,醬汁有點濃稠又不會太濃稠,口味鹹鹹甜甜又帶些輕微的辣味以及鮮香味,外觀上,也讓人邊吃邊觀望著鍋內那些扎扎實實的各種材料,心想到底是什麼?我想,喜歡嘗鮮也喜歡魚露味道的朋友一定也會很喜歡這醬汁。 影片段落 材料介紹: https://youtu.be/bXBg
我跟我家人都很愛這道菜,它簡直是白飯殺手,而且我發現越南菜好像還蠻喜歡豬肉搭配某樣海鮮一起料理的,也很令人驚訝這樣的海陸組合通常味道也很搭,如果有機會再跟大家分享另一道南薑紅燒三層肉與魚肉,那道菜也是一絕。 而今天和大家分享的這道菜則是以三層肉與蝦子一起紅燒,這種又鮮又香的滋味,我相信大家一定會很喜
還記得第一次吃到這料理,對它可愛的外形印象深刻,它是在越南餐廳常常可見的一道菜,而口味上,滿滿的鮮蝦味再加上因為是裹覆在甘蔗上,所以更加重它的鮮甜感,今天找到的這個教學影片,實屬懶人版本,不過味道可不馬虎哦。有興趣的朋友可以一起來做做看。 文化小教室(順化古都的甘蔗蝦) Chạo tôm được
Bún riêu 是一道在越南路邊常看到的小吃。它更常見的口味其實是螃蟹湯,但是由於不想使用現成的螃蟹罐頭,而且這影片看來都是唾手可得的材料,所以就決定好好看這部影片學做看看。 不過實際操作後拿給一個很會料理的越南朋友試吃看看,她說,零分,哈哈,真是十足不可面子。 但是慶幸的是,她拿出她炒好的魚露炒
第一次吃到這香蘭椰蓉餅(Bánh rây lá dứa nhân dừa),其實是一個印尼朋友的手路菜甜點 文化補充(Bánh rây) 重要段落 炒花生(https://youtu.be/8qGYdGLbwpc?t=3) 食材 餅皮 糯米粉(bột nếp) 木薯粉(bột năng) 內餡
【做就對了,不用想太多,令人驚喜的事情就會自己發生。】 就像,我想都沒有想過自己會站上料理台,教大家如何煮越南菜這件事。 這一陣子因為想讓自己完全放空,所以找了些一直以來都想做(學習速寫),或者只是單純不排斥的事情(試著料理)來讓自己空閒之餘接觸接觸。 一開始其實還著挺忙碌的,甚至因為怕自己偷懶,所
還記得第一次在越南某餐廳吃到這沾醬的驚艷,醬汁有點濃稠又不會太濃稠,口味鹹鹹甜甜又帶些輕微的辣味以及鮮香味,外觀上,也讓人邊吃邊觀望著鍋內那些扎扎實實的各種材料,心想到底是什麼?我想,喜歡嘗鮮也喜歡魚露味道的朋友一定也會很喜歡這醬汁。 影片段落 材料介紹: https://youtu.be/bXBg
我跟我家人都很愛這道菜,它簡直是白飯殺手,而且我發現越南菜好像還蠻喜歡豬肉搭配某樣海鮮一起料理的,也很令人驚訝這樣的海陸組合通常味道也很搭,如果有機會再跟大家分享另一道南薑紅燒三層肉與魚肉,那道菜也是一絕。 而今天和大家分享的這道菜則是以三層肉與蝦子一起紅燒,這種又鮮又香的滋味,我相信大家一定會很喜
還記得第一次吃到這料理,對它可愛的外形印象深刻,它是在越南餐廳常常可見的一道菜,而口味上,滿滿的鮮蝦味再加上因為是裹覆在甘蔗上,所以更加重它的鮮甜感,今天找到的這個教學影片,實屬懶人版本,不過味道可不馬虎哦。有興趣的朋友可以一起來做做看。 文化小教室(順化古都的甘蔗蝦) Chạo tôm được
Bún riêu 是一道在越南路邊常看到的小吃。它更常見的口味其實是螃蟹湯,但是由於不想使用現成的螃蟹罐頭,而且這影片看來都是唾手可得的材料,所以就決定好好看這部影片學做看看。 不過實際操作後拿給一個很會料理的越南朋友試吃看看,她說,零分,哈哈,真是十足不可面子。 但是慶幸的是,她拿出她炒好的魚露炒
第一次吃到這香蘭椰蓉餅(Bánh rây lá dứa nhân dừa),其實是一個印尼朋友的手路菜甜點 文化補充(Bánh rây) 重要段落 炒花生(https://youtu.be/8qGYdGLbwpc?t=3) 食材 餅皮 糯米粉(bột nếp) 木薯粉(bột năng) 內餡
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
本文彙整了一些關於 SQL 效能優化的技巧,提供讀者更快的資料處理方案。包括如何清空資料表、獲取最新資料、總和資料時的可能問題以及評估 SQL 語句效能的方法。通過合理的指令使用,能夠大幅提升查詢效率並降低錯誤發生的機率。適合資料庫管理者和程式開發者作為參考。
Thumbnail
本文介紹資料庫鎖(DB lock)的基本概念、鎖的類型及其優缺點。通過對資料庫鎖的深入探討,我們可以理解如何在多用戶環境下保護資料的一致性與完整性,並瞭解排他鎖、共享鎖、意向鎖等不同類型鎖的作用。此外,文章還分析了鎖競爭、鎖等待和死鎖等可能的問題,幫助讀者更全面地掌握資料庫鎖的運作機制。
Thumbnail
寫返底啲野,第日容易搵: PVE起左就可以用來做Development 場,起多個pgsql 。由於table 收目不少,呢啲時候就係問GPT 時間好過Google: 咁睇來用 dump出個sql file 行就快啲。 就咁打,緊係唔work 啦,咁要去Google ,搵到叫你去 /
Thumbnail
Ruby on Rails 是一個使用 Ruby 語言編寫的開源 Web 應用程式框架。 PostgreSQL 是一個強大、開源的物件關聯式資料庫系統,擁有超過 35 年的活躍開發歷程,並以其可靠性、功能強大性和效能而享有盛譽。 PostgreSQL 提供許多特定資料類型,以下是 Rails 支
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
Thumbnail
PostgreSQL 安裝與配置 前往 PostgreSQL 官方網站 https://www.postgresql.org ,點選 Download。 選擇自己的作業系統,筆者是使用 macbook,所以這邊我選擇 mac。 點選 download the installer,按下去之後會轉導到
Thumbnail
什麼是 PostgreSQL? PostgreSQL是一個開源的關聯式資料庫管理系統(RDBMS),最初由加州大學柏克萊分校開發,當時稱為Postgres(Post INGRES)。它於1986年首次釋出,並在1996年正式更名為PostgreSQL。自那時以來,PostgreSQL經過持續的開發和
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
本文彙整了一些關於 SQL 效能優化的技巧,提供讀者更快的資料處理方案。包括如何清空資料表、獲取最新資料、總和資料時的可能問題以及評估 SQL 語句效能的方法。通過合理的指令使用,能夠大幅提升查詢效率並降低錯誤發生的機率。適合資料庫管理者和程式開發者作為參考。
Thumbnail
本文介紹資料庫鎖(DB lock)的基本概念、鎖的類型及其優缺點。通過對資料庫鎖的深入探討,我們可以理解如何在多用戶環境下保護資料的一致性與完整性,並瞭解排他鎖、共享鎖、意向鎖等不同類型鎖的作用。此外,文章還分析了鎖競爭、鎖等待和死鎖等可能的問題,幫助讀者更全面地掌握資料庫鎖的運作機制。
Thumbnail
寫返底啲野,第日容易搵: PVE起左就可以用來做Development 場,起多個pgsql 。由於table 收目不少,呢啲時候就係問GPT 時間好過Google: 咁睇來用 dump出個sql file 行就快啲。 就咁打,緊係唔work 啦,咁要去Google ,搵到叫你去 /
Thumbnail
Ruby on Rails 是一個使用 Ruby 語言編寫的開源 Web 應用程式框架。 PostgreSQL 是一個強大、開源的物件關聯式資料庫系統,擁有超過 35 年的活躍開發歷程,並以其可靠性、功能強大性和效能而享有盛譽。 PostgreSQL 提供許多特定資料類型,以下是 Rails 支
Thumbnail
每日自動檢查資料庫運作所產生的訊息,若發現有錯誤,自動寄出警告信給擔當人員
Thumbnail
本篇說明如何利用Kubernetes特色,將PostgreSQL DB以HA的架構來提供服務,並說明相關的實作流程與說明。
Thumbnail
PostgreSQL 安裝與配置 前往 PostgreSQL 官方網站 https://www.postgresql.org ,點選 Download。 選擇自己的作業系統,筆者是使用 macbook,所以這邊我選擇 mac。 點選 download the installer,按下去之後會轉導到
Thumbnail
什麼是 PostgreSQL? PostgreSQL是一個開源的關聯式資料庫管理系統(RDBMS),最初由加州大學柏克萊分校開發,當時稱為Postgres(Post INGRES)。它於1986年首次釋出,並在1996年正式更名為PostgreSQL。自那時以來,PostgreSQL經過持續的開發和