發(fā)布于:2021-01-14 10:37:46
0
100
0
考慮到現(xiàn)代開發(fā)流程時,與提供的代碼開發(fā)工具相比,我總是發(fā)現(xiàn)數(shù)據(jù)庫開發(fā)工具尚未開發(fā)。我們擁有版本控制系統(tǒng),審閱工具,CI / CD解決方案,短毛絨等等。它們很多,因此您可以根據(jù)需要自動化工作流程,并專注于編寫代碼。但是,現(xiàn)代開發(fā)工具現(xiàn)在無能為力的是如何處理和版本數(shù)據(jù)庫更改。
建立自動數(shù)據(jù)庫開發(fā)流程的斗爭
我嘗試了許多不同的方法:模式比較工具(復制器,Redgate,DBComparer等)與版本控制掛鉤相結合,編寫遷移,使用ORM框架進行自動遷移等。但是始終沒有成功,只能恢復為半手動方法。當然,數(shù)據(jù)庫模式比較工具可以很好地完成工作,但是要考慮復雜的部署管道,藍/綠部署,回滾等。在這里,您必須手動執(zhí)行很多操作才能使模式比較真正起作用。
我有一個項目,其中數(shù)據(jù)的架構和結構確實非常復雜且不穩(wěn)定。這是一個數(shù)據(jù)密集型應用程序,我不得不更改很多架構和數(shù)據(jù)。這造成了很大的痛苦,最終使我的交付流程成為自動步驟和手動步驟的組合,這使整個過程緩慢而費力。
弄亂數(shù)據(jù)模式時事情很難
那么,自動化數(shù)據(jù)庫開發(fā)時常見的痛點是什么?
代碼和狀態(tài)問題。您必須獨立于代碼來跟蹤數(shù)據(jù)庫更改。這意味著您不能總是說此特定提交將與數(shù)據(jù)庫的當前版本一起使用。測試會有所幫助。如果您對數(shù)據(jù)庫對象有ORM定義,那就很好了,因此您可以從代碼中重新創(chuàng)建整個結構。但是在那種情況下,問題在于您應該考慮如何處理現(xiàn)有數(shù)據(jù)。您可能必須為開發(fā),測試和生產(chǎn)環(huán)境開發(fā)單獨的方法。另外,您可以在數(shù)據(jù)庫本身內部跟蹤模式版本,并在代碼內部存儲指向版本的鏈接。將此與遷移結合起來,這就是大多數(shù)Web框架處理它的方式?;蛘撸梢詫⒄麄€數(shù)據(jù)定義語句導出到代碼中。
與時俱進的問題。您不必忘記自己編寫遷移。跳過這個關鍵步驟總是很猶豫的,尤其是對于回滾部分。如果使用ORM會更容易,因為您始終可以在代碼中區(qū)分定義。如果不是,則必須謹慎,不要錯過所做的任何微小更改。模式比較工具在這里確實很有幫助。
成本問題。對數(shù)據(jù)庫的更改非常昂貴。如果在開始生產(chǎn)之前具有穩(wěn)定的數(shù)據(jù)庫結構,則很好。當然不是。隨著您獲取更多數(shù)據(jù),添加字段將變得越來越昂貴。而且,當您希望將派生數(shù)據(jù)庫用于ETL層進行分析時,事情將開始崩潰,您將陷入困境。
數(shù)據(jù)回歸問題。更改數(shù)據(jù)庫很危險。您是否害怕刪除字段?你必須。這就是為什么許多公司從不刪除字段,也沒有冗長而復雜的生產(chǎn)模式變更過程。但是保留所有遺留字段會使架構難以維護。只有好的文檔才能為您提供幫助。我從未見過。
時間問題。對數(shù)據(jù)庫的更改很慢。您要添加字段或更改現(xiàn)有字段,必須測試代碼是否正確處理了新架構,然后繼續(xù)進行并測試登臺服務器上的部署。如果您有生產(chǎn)數(shù)據(jù)庫的副本,那就很好。但是有時候你沒有。因此,您必須檢查生產(chǎn)中的所有內容,以避免由于數(shù)據(jù)更改而引起的常見陷阱,例如在切換字段類型或忘記外鍵時丟失數(shù)據(jù)。是的,外鍵。當您要觸摸關鍵字段時,緊密耦合的數(shù)據(jù)始終是挑戰(zhàn)。這是非常耗時的。
解決方案
我真正想要的是一個可以解決上述問題的工具。看起來如何?關于它應該做什么的一些想法:
它將與版本控制工具(git)集成。當我提交時,它將快照數(shù)據(jù)庫架構。更改應該是可逆的,并在可能的情況下分別應用??紤]差異的模式。
應用更改時,應注意數(shù)據(jù)。重命名字段,更改字段類型和添加約束不應降低數(shù)據(jù)質量。例如,刪除字段實際上不應從數(shù)據(jù)庫中刪除值,而應將其移動到諸如field_a_delteted之類的位置。
單個命令行工具可處理可輕松集成到CI / CD管道中的所有任務。與許多人一樣,我喜歡在控制臺中工作。想象一下簽出修訂并執(zhí)行類似“數(shù)據(jù)庫還原”的操作。監(jiān)控和日志。此特定遷移需要多長時間?有錯誤嗎?
一個UI,用于查看對數(shù)據(jù)庫所做的更改。評論對于代碼至關重要,為什么不對數(shù)據(jù)也是如此?這可以通過在ORM定義中進行差異來部分解決,但它沒有提供有關影響多少數(shù)據(jù)的內幕。
在評估上述要點時,我認為它可能不僅僅是一個工具,而是一個完整的數(shù)據(jù)庫管理框架,結合了用于建立完整數(shù)據(jù)庫開發(fā)管道的方法,模板和框架。啟動Web項目時,通常從框架開始。它將指導您如何組織有關應用程序的事情。添加數(shù)據(jù)框架將指導您如何組織有關數(shù)據(jù)庫及其更改的事情。我不是在談論ORM。
我個人認為,隨著應用程序朝著智能,基于ML的解決方案的方向緩慢發(fā)展,數(shù)據(jù)模式變得越來越復雜??焖僖胱兏⒃诰€進行測試的必要性對于今天的競爭至關重要。我真的感到需要新的出色的現(xiàn)代數(shù)據(jù)工具。