小型地區與特殊代碼在資料裡的地位很尷尬:它們真實存在,卻往往不符合系統對「一個地方」的想像。人口少、資料少、命名方式多樣,而且經常被當成附屬品處理。等到它們真的出現在資料裡,問題才會一次爆發。以下把這類邊界物件該被怎麼對待整理清楚。
哪些地區最容易在資料裡出錯?
第一類是規模極小但制度獨立的地方,它們可能有自己的貨幣、電信編碼或投遞體系,卻因為使用者少而長期沒有被納入清單。第二類是與母國關係特殊的屬地與海外省,它們的資料歸屬需要個別討論。
第三類最麻煩:在官方體系裡沒有獨立代碼、只出現在下級分區體系裡的地方。這類對象在標準文件裡找得到,但你的下拉選單可能從來沒有它們的位置。第四類是保留碼與過渡碼,它們可能出現在歷史資料裡,卻不該被當成一般輸入來處理。
這四類的共通點是「數量少但處理方式特殊」。正因為少,它們很容易在清單被建立時就被整批忽略,事後才由使用者回報。
兩位代碼並不是每個地區都有
並非每個地區都有獨立的兩位代碼,有的只出現在下級分區的編碼體系裡。這代表「沒有兩位代碼」本身不是錯誤,而是一種需要被表達的狀態。
系統設計時要避免把兩位代碼當成唯一的存在條件。如果資料表以它為主鍵,那麼沒有這個代碼的地方就無法被收錄,只能被塞進某個籠統的分類裡,而那個分類日後會變成一個誰都不想碰的雜物間。
替代做法是讓主要識別方式具備層級:有獨立代碼的用代碼,沒有的用母體加下級識別的組合,並且在資料上標明它屬於哪一種情形。編碼體系的分工與下級分區的關係,可以對照國家碼與下級行政區代碼那篇。
保留碼與過渡碼也要單獨處理。它們不是「不合法的輸入」,而是「有歷史意義但不該進入新資料的值」。遇到時應該被辨識並轉換或標記,而不是直接拒絕,因為直接拒絕會讓一批舊資料無法通過驗證。
舊稱與自稱在輸入裡怎麼處理
使用者不會照著官方名稱輸入。他可能用俗稱、用被合併之前的舊稱,也可能用當地語言的自稱。這三種在系統裡的地位不同,處理方式也該不同。
舊稱通常有明確的歷史對應,適合收進別名表並標明有效期間;自稱則需要先確認它指的是哪一個對象,才能建立對應。俗稱最難處理,因為它可能同時指向多個地方,這時不該強行對應,而應該回傳候選讓使用者確認。
處理原則很簡單:能唯一對應的就自動對應,不能唯一對應的就提供選項,完全無法對應的就安全地拒絕並保留原始輸入。三種結果都要有明確的行為,不要讓某些輸入落入無人處理的灰色地帶。
輸入的各種寫法與別名機制本身屬於另一個題目,這裡只說明「舊稱與自稱在資料裡會出現」這件事,詳細的比對策略見同主題的國家名稱比對與別名那篇。
還有一種情況值得預先處理:使用者輸入的舊稱,屬於兩個地方合併之前的那一個。這類輸入在歷史上真實存在,卻已經沒有對應的現行項目。系統至少要能辨識它屬於已合併的舊稱,並在提示中說明對應關係,而不是讓它靜靜地變成查無資料。
「不適用」和「未知」要分開記?
一定要分開。這兩者看起來都是「沒有值」,但意義完全相反:不適用代表這個欄位在這裡本來就不存在,未知代表欄位成立、只是我們還不知道值。
混在一起記錄,報表就會把「這裡本來就沒有」算成「我們漏了資料」,於是待補清單裡永久躺著一批永遠補不完的項目,真正該處理的缺失反而被稀釋掉。
| 狀態 | 意義 | 正確的後續動作 |
|---|---|---|
| 不適用 | 這個欄位在此不成立 | 記錄判斷依據,不必補值 |
| 未知 | 欄位成立但值不明 | 排入待補並指定負責人 |
| 有值 | 已確認的值 | 定期檢視是否仍然有效 |
分開記錄還有一個好處:它能讓「這裡到底有沒有這個欄位」成為一個可以回答的問題。這個問題在跨地方比較時幾乎一定會被問到,而沒有三態區分的清單答不出來。
分開記錄的另一個實際效益是錯誤訊息。當使用者因為一個本來就不存在的欄位被擋下來時,系統應該說明這個欄位在此不適用,而不是回報成格式錯誤;前者讓他知道不必再試,後者只會讓他反覆修改一個本來就正確的輸入。
不支援與格式錯誤不是一件事
「不支援配送到這裡」是產品決策,「格式錯誤」是資料問題。兩者混用會讓使用者反覆修改一個本來就正確的地址,而系統每次都用同一句話回應,於是他只能不斷重試或放棄。
在資料層面,兩者也應該使用不同的狀態。業務限制是穩定的、可以事前查詢的;格式錯誤是逐筆的、需要使用者修正的。把它們壓成同一個錯誤代碼,日後的報表就分不出究竟是能力不足還是品質不佳。
還有一個常見的混淆:把「這個地方不在支援範圍」寫成某種驗證規則。這樣做短期能達到目的,但當業務決定開放時,你得先找到那條被埋在驗證邏輯裡的規則,而不是去改一個設定。
給開發者:給小型地區準備一組固定樣本
這類邊界物件不需要每個都建立完整資料,但需要一組固定的樣本,並且明確斷言它們特有的欄位組合。
- 為每一類邊界情形挑一到兩個代表樣本,不要窮舉。
- 針對每個樣本斷言它的特殊之處,例如哪些欄位不適用。
- 保留一個沒有獨立代碼的樣本,用來驗證替代識別方式真的可行。
- 保留一個出現在歷史資料裡的舊值樣本,確認它不會被直接拒絕。
- 每次新增或移除樣本時,同步更新說明,避免後人不知道它為何存在。
本文的小型地區樣本與特殊代碼情境都是為了壓測邊界而構造的合成用例,不代表任何真實地區的編碼歸屬或行政地位,也不構成對任何歸屬的判斷。挑選這類樣本的方法,可以讀挑選測試國家的方法;當它與一筆跨境交易同時出現時,見跨境地址場景。
下一步
在你的清單裡找出所有「沒有值」的格子,逐格判斷它是不適用還是未知。這一步通常不需要新增資料,卻能立刻讓待補清單變得可信。實際的地區清單與欄位樣貌,可以在國家與地區目錄查看。