Mysql

轉換數據庫模式的最佳解決方案是什麼?

  • September 17, 2014

我實際上想擺脫數據庫中現有的約束,我知道這聽起來很瘋狂,但我們正在將我們的應用程序升級到一個依賴於外鍵約束名稱的新框架,而且我們正在做一堆清理和重命名欄位,表等

我想一個更好的解決問題的方法是給定一個現有的數據庫,它需要經過以下操作:

  • 使用在框架內工作的名稱創建所有全新的外鍵約束
  • 表將被重命名和/或大規模重組,包括重命名目前屬於現有外鍵關係的欄位

實現這一目標的最佳方法是什麼?

到目前為止,我的解決方案是:

  1. 創建一個轉換腳本(在 php 中),它將為數據庫中的所有約束執行 DROP FOREIGN KEY。這導致在嘗試 ALTER TABLES 並添加新約束時,在流程的後續步驟中發生奇怪的錯誤。此外,約束已被刪除,但如果我嘗試自己刪除密鑰,則會出現錯誤。
  2. 不要使用 PHP 和 PDO,而是使用直接 SQL 編寫轉換腳本並使用 CURSOR 來刪除約束。
  3. 與其刪除約束本身,不如將表轉換為 MyIsam 並 DROP 鍵,然後轉換回 Innodb,然後繼續進行其餘的轉換過程。
  4. 從頭開始創建一個全新的模式,然後將數據從舊模式移動到新模式。

我想知道哪些方法會被認為是最有效的?或者如果有更好的方法來做到這一點?

更新(此資訊是在聊天室中請求的,所以我想我會在這裡添加):

  • 目前模式有 68 個表,新模式將接近 55 個。
  • 最大的表有超過 800,000 行,一般來說我們的表有數万行。
  • 整個數據庫大約為 240 MB,但其中大部分位於儲存大型文本欄位的單個表中。我們將在轉換過程中對其進行壓縮。

有一點是,一步一步的清理變得比干淨的石板和遷移方法更多的工作。在處理較大的捲時,系統可用性和遷移時間可能會影響決策,但在這種大小下,這不是問題。

對我來說,關鍵因素是:

  • 重命名外鍵約束以適應新的應用程序框架。
  • 重構大部分現有表。
  • 數據量少。

在這種情況下,我很想設計一個適合您現在需要的模型的新模式,並創建必要的腳本來遷移數據(您的選項 4)。

引用自:https://dba.stackexchange.com/questions/6958