先盤點誰仍然使用舊欄位
資料表把temp改成temperature_c後,舊報表可能立即找不到欄位,也可能因欄位順序變動讀到錯值。先不要只在資料庫完成改名就宣布結束,列出使用者:排程報表、HMI查詢、下載檔、試算表與其他系統的匯入介面。
相容層的作用,是在內部結構調整期間,對舊使用者繼續提供原來約定的欄名、型別、單位與行為。常見方式是有明確版本的查詢檢視或介面輸出,不必讓所有客戶同一時間改版,但需要清楚的維護與退場計畫。
先分清純改名與語意改變。temp原本已是攝氏溫度,只改成更清楚名稱,可能用欄位別名維持相容;如果原本是原始整數,現在變成工程值,單純改名不能保持舊程式的計算結果。
本文以PostgreSQL 18檢視的文件語意作例,重點是介面契約與驗證。其他資料庫對建立或替換檢視、權限及可更新性的規則不同,實際變更先在副本驗證,不直接套用到正式資料庫。
把舊契約寫成可比較的清單
空值相容也要逐欄判定。舊欄位的空值若表示未量測,新欄位的零表示實測零,不能在相容層把空值一律轉零。保留未量測的狀態,並檢查舊報表是否會忽略空值或改變有效樣本數。
列出舊欄位名稱、資料型別、允許空值、單位、精度、欄位順序及每列代表的粒度。例:event_id是事件識別,temp是攝氏數值,event_time是UTC事件時間。若這些原來沒有文件,先從既有程式與代表資料確認。
再建立新舊對照:舊temp對應新temperature_c,保持相同數值與型別;舊event_time對應來源事件時間,不因改名就換成收件時間。別名只能解決名稱,不能自動修復兩個欄位不同的業務意義。
對按欄位位置讀CSV或資料列的客戶,欄名正確但順序改變仍可能出錯。舊版本輸出明確列欄位順序,不依賴「全部欄位」的隱含展開。新欄位可以放在新版本介面,是否容許舊版增加欄位須查客戶解析方式。
若新資料允許更多小數位,轉回舊型別可能造成四捨五入、截斷或超出範圍。先列可表示範圍與轉換規則,不能用失敗時補零來假裝相容。零是有效數值時,這種補救尤其難被察覺。
完成這份契約,應能逐欄指出相同之處、需要轉換之處與無法無損相容之處。不可無損表示時,應由介面升版處理,別把資料損失藏在別名背後。
用固定輸出檢視隔開內部變動
可讓舊報表讀report_v1的穩定輸出,而新報表讀report_v2。兩者都從受控資料來源查詢,明確選出各版欄位及計算規則。版本名稱只是示例,實際命名依專案;不要讓舊客戶繼續直讀會頻繁改動的內部表。
PostgreSQL文件說明,CREATE OR REPLACE VIEW替換時,既有輸出的欄名、順序與型別須保持一致,允許在末尾增加欄位。這是資料庫的替換限制,不等於所有客戶都能接受末尾加欄;兩層相容性要分開檢查。
一般檢視是在查詢時執行定義,不是自動保存一份歷史快照。若希望保留舊報表發布結果,仍要另有版本或快照機制。使用檢視能穩定介面,但不會自動記住資料修改前的內容。
相容層若合併新舊資料,確認每個事件只出現一次。切換期雙寫兩表時,直接把兩表全部聯集可能重複;另一種不恰當的去重又可能刪掉內容相同的真事件。以明確事件身分及生效範圍制定合併規則。
權限也屬於契約。舊報表能讀不表示應因此獲得修改權限;檢視是否可更新、用誰的權限查底層資料,依實際設定與文件驗證。本文只討論報表讀取,不把可查詢檢視默認成安全隔離邊界。
以代表資料做新舊輸出對照
效能驗收使用代表性的歷史範圍。相容層新增連接或轉換後,結果雖相同,查詢時間仍可能增加;記錄負載與延遲,必要時再依資料庫計畫調整。
另外測篩選與排序,不只比輸出畫面。原本數字十與二若改成文字排序,可能十排在二前面;日期改成地區格式後,字串順序也可能不再是時間順序。這些問題會影響報表取最大值或最新一筆。
測試至少包括正常值、零、負值、空值、極值與跨版本資料。以事件識別逐列比較,再檢查列數、欄序、型別及單位。只比合計容易讓兩個相反錯誤互相抵銷,掩蓋個別列錯置。
例:舊版temp為25.3,新內部temperature_c也是25.3,舊介面仍應給25.3。若新內部改存整數253,相容層需要按明確倍率轉換;但倍率若隨版本不同,必須連同版本解釋,不能固定除十處理全部歷史。
再讓真正的舊報表或其測試副本連到相容介面,檢查欄位解析、日期格式與匯出。資料庫查詢成功不代表下游也成功,有些客戶會快取結構,或對空值和字串格式有自己的假設。
完成後保留舊介面使用清單、相容測試結果及新客戶移轉進度。只有確認沒有需要保留的使用者,且符合保存與回復要求後,才按變更程序退場舊版;不要只看一天沒有流量就刪除月報會用的介面。
練習與常見問題
練習:舊客戶按三欄位置讀事件ID、溫度、時間,新版在第二欄插入品質。即使溫度欄名沒變,舊客戶也可能讀錯。解法是在舊版輸出保持原三欄順序,讓新增品質走明確的新版本,並用舊解析器實測。
失敗時先查是找不到名稱、型別不符、欄序錯誤或語意變更。不同問題有不同修正方向,不要全部靠改成文字欄位繞過,否則排序與計算還可能產生新錯誤。
問:改名後加別名就一定相容嗎?答:還要核對型別、單位、空值與每列意義。
問:檢視會自動保存舊結果嗎?答:一般檢視不會,發布快照另行管理。
問:資料庫允許加欄就表示舊CSV可讀嗎?答:不一定,客戶可能按位置或固定欄數解析。
問:相容層可以永遠不維護嗎?答:仍需版本、測試及使用者追蹤,否則會累積無人理解的規則。
參考:PostgreSQL 18 CREATE VIEW:檢視、替換限制、權限及可更新性。