簡體   English   中英

如何在開發過程中管理數據庫?

[英]How do you manage databases during development?

我的四人開發團隊已經面臨這個問題一段時間了:

有時我們需要處理同一組數據。 因此,當我們在本地計算機上進行開發時,dev數據庫將遠程連接。

但是,有時我們需要在db上運行操作,這些操作將依賴於其他開發人員的數據,即我們破壞關聯。 為此,本地數據庫會很好。

是否有解決這種困境的最佳做法? 有沒有像“數據SCM”工具?

以一種奇怪的方式,在git repo中保留SQL插入/刪除/更新查詢的文本文件會很有用,但我認為這可能非常快速地變慢。

你們怎么處理這個?

您可能會發現我的問題如何從源代碼控制構建數據庫有用。

從根本上說,有效管理共享資源(如數據庫)很難。 這很難,因為它需要平衡多人的需求,包括其他開發人員,測試人員,項目經理等。

通常,為個體開發人員提供他們自己的沙盒環境更有效,他們可以在這種環境中執行開發和單元測試,而不會影響其他開發人員或測試人員。 這不是靈丹妙葯,因為您現在必須提供一種機制來保持這些多個獨立環境隨着時間的推移彼此同步。 您需要確保開發人員有合理的方式來獲取彼此的更改(包括數據,架構和代碼)。 這不是必須的。 良好的SCM實踐可以提供幫助,但仍需要相當程度的合作和協調才能實現。 不僅如此,而且為每個開發人員提供他們自己的整個環境副本可能會帶來存儲成本,以及額外的DBA資源,以幫助管理和監督這些環境。

以下是一些供您考慮的想法:

  1. 創建一個共享的公共“環境白板”(它可以是電子白板),開發人員可以輕松查看哪些環境可用以及誰在使用它們。
  2. 標識要擁有數據庫資源的個人或組。 他們負責跟蹤環境,並幫助解決不同群體(開發人員,測試人員等)的沖突需求。
  3. 如果時間和預算允許,請考慮為所有開發人員創建沙箱環境。
  4. 如果您還沒有這樣做,請考慮將開發人員“游戲區域”與集成,測試和驗收測試環境分開。
  5. 確保版本控制關鍵數據庫對象 - 特別是那些經常更改的對象,如觸發器,存儲過程和視圖。 如果有人覆蓋別人的變化,你不想失去工作。

我們使用本地開發人員數據庫和單個主數據庫進行集成測試。 我們在SCM中存儲創建腳本。 一位開發人員負責根據“黃金主”模式更新SQL腳本。 開發人員可以根據需要對其本地數據庫進行更改,根據需要從集成數據庫中的數據填充,使用導入過程或使用工具生成數據(在我們的示例中為紅門數據生成器)。 如有必要,開發人員會清除其本地副本,並可根據需要從創建腳本和集成數據進行刷新。 通常,數據庫僅用於集成測試,我們將其模擬出來進行單元測試,以最大限度地減少保持事物同步的工作量。

我建議你看一下Scott Allen對此事的看法。 他寫了一系列博客,我認為這些博客非常出色。 數據庫工作的三個規則基線更改腳本視圖,存儲過程等分支和合並

我或多或少地使用這些指南,個人改變並且它們起作用。

在過去,我已經處理過這幾種方式。

一個是創建和填充數據庫的SQL Script存儲庫。 這根本不是一個糟糕的選擇,並且可以使所有內容保持同步(即使您沒有使用此方法,您仍應保留這些腳本,以便您的數據庫位於源代碼管理中)。

另一個(我更喜歡)是服務器上沒有連接的“干凈”開發數據庫的單個實例。 當開發人員需要刷新他們的開發人員數據庫時,他們運行了一個SSIS包,將“干凈”的數據庫復制到他們的開發副本上。 然后我們可以根據需要修改我們的開發數據庫,​​而不必踩到其他開發人員的腳。

我們有一個數據庫維護工具,我們使用它創建/更新我們的表和我們的過程。 我們有一台服務器,其中包含一個填充了數據的最新數據庫。

我們保留了我們可以選擇的本地數據庫,但是當我們需要返回“基線”時,我們從服務器獲得“主”的備份並在本地恢復。

如果/當我們添加列/表/ procs時,我們更新保存在源代碼管理中的dbMaintenance工具。

有時,它是一種痛苦,但它的效果相當好。

如果使用ORM(如nHibernate),請創建一個腳本,在開發人員的LOCAL開發數據庫中生成模式和數據。

在開發過程中改進該腳本以包括典型數據。

部署前在臨時數據庫上進行測試。

我們確實為最終用戶將生產數據庫復制到UAT數據庫。 開發人員無法訪問該數據庫。

刪除所有表,再次創建它們並注入測試數據只需不到幾秒鍾。

如果您使用的是生成模式的ORM,則無需維護創建腳本。

以前,我研究過與數據倉庫相關的產品,並且如果需要,可以安裝在客戶端站點上。 因此,該軟件知道如何進行“安裝”(主要是創建所需的數據庫模式和靜態數據的集合,如貨幣/國家代碼等)。

因為我們在代碼本身中有這些信息,並且因為我們有可插入的SQL適配器,所以讓這段代碼與內存數據庫(我們使用HSQL)一起工作是微不足道的。 因此,我們針對“真正的”本地服務器(Oracle或SQL Server)進行了大部分實際開發工作和性能測試,但針對特定於流程的內存數據庫執行了所有單元測試和其他自動化任務。

在這方面我們非常幸運,如果集中靜態數據發生了變化,我們需要將其包含在安裝說明的升級部分中,因此默認情況下它存儲在SCM存儲庫中,由開發人員檢出並且作為正常工作流程的一部分安裝。 在反思時,這與您提出的數據庫更改日志的想法非常相似,除了更加形式化並且圍繞它的特定於域的抽象層。

這個方案非常有效,因為任何人都可以在幾分鍾內構建一個具有最新靜態數據的完全正常工作的數據庫,而無需踩到其他任何人的腳趾。 如果你不需要安裝/升級功能,我不能說它是否值得,但無論如何我會考慮它,因為它使數據庫依賴完全無痛。

這種方法怎么樣:

為“干凈的數據庫”維護一個單獨的倉庫。 repo將是一個帶有表創建/插入等的sql文件。

使用Rails(我確信可以適用於任何git repo),將“clean db”維護為應用程序中的子模塊。 編寫一個腳本(可能是rake任務),用SQL語句查詢本地dev db。

要清理本地數據庫(並替換為新數據):

git submodule init
git submodule update

然后

rake dev_db:update ......... (or something like that!)

我做了兩件事之一。 在這兩種情況下,處理可能與其他代碼沖突的代碼的開發人員在本地運行自己的數據庫,或者在dev數據庫服務器上獲取單獨的實例。

  • 類似於@tvanfosson建議,你把一組SQL腳本,可以從頭開始建立數據庫,

  • 在定義良好的定期基礎上,所有開發人員數據庫都會被生產數據副本覆蓋,或者使用按比例縮小/取消標識的生產副本進行覆蓋,具體取決於我們使用的數據類型。

我同意LBushkin在他的回答中所說的一切。 如果您正在使用SQL Server,我們在Red Gate上有一個解決方案,可以讓您輕松地在多個開發環境之間共享更改。

http://www.red-gate.com/products/sql_source_control/index.htm

如果存在存儲問題導致您的DBA難以允許多個開發環境,則Red Gate可以為此提供解決方案。 借助Red Gate的HyperBac技術,您可以為每個開發人員創建虛擬數據庫。 這些看起來與普通數據庫完全相同,但在后台,不同數據庫之間共享公共數據。 這允許開發人員擁有自己的數據庫,而不會占用SQL Server上不切實際的存儲空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM