Custom_migration.md

Translated by ChatGTP

自定義遷移(概念)

當數據庫和表是靜態的時候,Laravel 遷移就足以實現遷移需求。

但是如果數據庫和表是動態的,就會有一些問題。

  • 每當動態表模式更改時需要遷移記錄
  • 創建動態表時需要遷移記錄
  • 數據庫遷移進度不同,需要如何回滾?

動態數據庫方案

  1. 主數據庫:main

該數據庫的表是靜態的。

表格:companies, workers

工人架構

idnameworker_typedb_ncompany_idcreated_atupdated_at
1Tonybackend112022-12-12 00:00:002022-12-12 00:00:00
2Brainfrontend322022-12-12 00:00:002022-12-12 00:00:00

選擇的工人類型可以是:backend、frontend、architect、DevOps…

  1. 國家數據庫:company_{N}

main.companies 表中的行有動態數據庫,{N} 將是 main.companies.id,當新公司在系統中註冊時,需要創建 company_{N} 數據庫和相關表格。

表格:settingsinfo

  1. 城市數據庫:worker_{worker_type}_{N}

main.workers 中的每一行都會有一個動態數據庫,假設我們有一個工人,他的 worker_typefrontenddb_n 是 3,則數據庫名稱將是 worker_frontend_3,數據庫中的表格取決於 worker_type

解決方案 1 - Laravel 遷移

直接使用 Laravel 遷移。

  • 修改 main 數據庫,只需修改靜態模式
  • 修改 company_{N},循環每個公司並修改每個模式
  • 修改 worker_{worker_type}_{N},循環每個工人並修改每個模式

然而,此解決方案無法記錄每個數據庫遷移記錄,因為數據庫是動態創建的。

解決方案 2 - 自定義遷移

遷移文件夾。

  • main:/migrations/main
  • companies:/migrations/company
  • workers:
    • frontend:/migrations/worker/fonrtend
    • backend:/migrations/worker/backend
    • architect:/migrations/worker/architect
  1. 自定義遷移模式

migration_main

idfileexecuted_at
12022_12_30_120000_create_workers_table2022:12:30 00:00:00

migration_companies

idcompany_idfileexecuted_at
112022_12_30_120000_create_settings_table2022:12:30 00:00:00
222022_12_30_120000_create_settings_table2022:12:30 00:00:00

migration_workers

idworker_idfileexecuted_at
112022_12_30_120000_create_nosql_table2022:12:30 00:00:00
222022_12_30_120000_create_css_table2022:12:30 00:00:00

遷移

idmigrate_typemigrate_idtypebatchcreated_atupdated_at
1main1modify_schema12022:12:30 00:00:002022:12:30 00:00:00
2worker1new22022:12:30 00:00:002022:12:30 00:00:00
  1. 創建一個自定義遷移命令

遍歷每個遷移文件,檢查是否由不同的遷移表執行,運行遷移後,將遷移記錄插入相關表格,所有記錄都需要存儲在 migrations 表格中,這是總遷移表格。

  1. 創建公司或工人時插入相關遷移記錄。

  2. 回滾邏輯

在運行某些模式修改遷移後,我們創建了一個新的公司,但隨後我們意識到上次修改的模式是錯誤的,需要回滾。

但是,如果我們僅運行上一批次的回滾文件,我們將失去我們創建的新公司數據庫。

這就是為什麼 migrations 表格中有一個 type,我們只提取上一個 batch,其中 typemodify_schema,掃描在該批次中執行的所有文件,並為“每個”公司和工人運行回滾,然後刪除遷移文件,這樣我們可以保持所有數據庫模式保持不變而不失數據。