Postgresql 資料庫 Migration 方案的選擇

更新於 發佈於 閱讀時間約 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
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
Ruby on Rails 是一個使用 Ruby 語言編寫的開源 Web 應用程式框架。 PostgreSQL 是一個強大、開源的物件關聯式資料庫系統,擁有超過 35 年的活躍開發歷程,並以其可靠性、功能強大性和效能而享有盛譽。 PostgreSQL 提供許多特定資料類型,以下是 Rails 支
※ 什麼是資料庫反正規化?優缺點是什麼? ※ 什麼是資料庫反正規化? 資料庫反正規化(Database Denormalization)是一種將資料庫中的資料再次加工,將資料從正規化狀態轉換為非正規化狀態的過程。在反正規化中,我們通常會將數據合併到一個或少量表中,以提高查詢性能或簡化數據模型。
※ 什麼是資料庫正規化?為什麼需要正規化? 什麼是資料庫正規化? 資料庫正規化是一種設計關聯式資料庫的方法,目的是建立良好結構的關聯表,主要目的有二: 去除重複性:建立沒有重複的關聯表。因為重複資料不只浪費資料庫的儲存空間,而且會產生資料維護上的問題。 去除不一致的相依性:資料相依是指關聯表
※ ORM 是什麼?ORM 的優缺點是什麼? ORM 是什麼? ORM 專用於關聯式資料庫 (relational database)一種叫「物件映射 (object mapping)」 的技術,主要是用程式語言裡的「物件」來包裝資料庫的 SQL (structured query langua
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
這是文科轉職數據工程師系列的第一篇文章。 許多人會在轉職前上許多數據分析課程,該怎麼選擇比較適合自己,但又不會噴錢呢? 這篇文章要介紹這個轉職過程前的準備工作。
Thumbnail
現代社會跟以前不同了,人人都有一支手機,只要打開就可以獲得各種資訊。過去想要辦卡或是開戶就要跑一趟銀行,然而如今科技快速發展之下,金融App無聲無息地進到你生活中。但同樣的,每一家銀行都有自己的App時,我們又該如何選擇呢?(本文係由國泰世華銀行邀約) 今天我會用不同角度帶大家看這款國泰世華CUB
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
儲存庫 (Repository) 是檔案(File)的儲存區域。 在版本控制中,儲存庫是包含所有檔案的資料夾[1]。 每次改動檔案,你都可以選擇要不要儲存。 而那些有被處存的改動,就被稱為「提交 Commit」[2]。 而當一個儲存庫有多個開發者(Developer)在貢獻,
Thumbnail
在進行Electron 專案時,後端夥伴選擇將 sqlite 資料庫跟專案檔打包成一個執行檔。在開發過程中,前端的操作經常會更動到 db的資料,此時 Git 就會追蹤到 db 的變化,因此前端在推送檔案到遠端 repo 前,會需要將其移出 Git 追蹤範圍,該怎麼做?
Thumbnail
Ruby on Rails 是一個使用 Ruby 語言編寫的開源 Web 應用程式框架。 PostgreSQL 是一個強大、開源的物件關聯式資料庫系統,擁有超過 35 年的活躍開發歷程,並以其可靠性、功能強大性和效能而享有盛譽。 PostgreSQL 提供許多特定資料類型,以下是 Rails 支
※ 什麼是資料庫反正規化?優缺點是什麼? ※ 什麼是資料庫反正規化? 資料庫反正規化(Database Denormalization)是一種將資料庫中的資料再次加工,將資料從正規化狀態轉換為非正規化狀態的過程。在反正規化中,我們通常會將數據合併到一個或少量表中,以提高查詢性能或簡化數據模型。
※ 什麼是資料庫正規化?為什麼需要正規化? 什麼是資料庫正規化? 資料庫正規化是一種設計關聯式資料庫的方法,目的是建立良好結構的關聯表,主要目的有二: 去除重複性:建立沒有重複的關聯表。因為重複資料不只浪費資料庫的儲存空間,而且會產生資料維護上的問題。 去除不一致的相依性:資料相依是指關聯表
※ ORM 是什麼?ORM 的優缺點是什麼? ORM 是什麼? ORM 專用於關聯式資料庫 (relational database)一種叫「物件映射 (object mapping)」 的技術,主要是用程式語言裡的「物件」來包裝資料庫的 SQL (structured query langua
Thumbnail
※ 基本操作:SQL 語法,SELECT, WHERE, CREATE, UPDATE, DELETE。 SELECT:從資料庫中或資料表中指定要選擇的欄位中取得資料,稱之為查詢 (query)。 ※ 語法:要由兩部分構成,第一部分是要 "拿什麼" 資料 (若有多項用逗號隔開);第二部分則為
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
Thumbnail
這是文科轉職數據工程師系列的第一篇文章。 許多人會在轉職前上許多數據分析課程,該怎麼選擇比較適合自己,但又不會噴錢呢? 這篇文章要介紹這個轉職過程前的準備工作。