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