なぜ (たとえば) 顧客の住所を古い国コードで表示したいのでしょうか?
私の理解が正しければ、現在もまだ「セルビアとモンテネグロ」を指している「住所」レコードがあります。その問題を解決すれば、現在の質問は存在しないと思います。
ISO 3166 のすべての「国」が実際に独立しているわけではありません。むしろ、それらの多くは地理的に離れた地域であり、法的には他の国の一部または従属国です。
また、「撤回された国コード」は 5 年間予約されていることに注意してください。つまり、5 年後に再利用される可能性があります。そのため、国コード自体を主キーとして使用しないようにすることは、特に歴史的な理由で以前の国コードを遡る必要がある場合は、私にとって理にかなっています。
それでは、新しい国 ID を指す「撤回された」フィールド/テーブルを作成してみませんか。このフィールドが空であるか、必要に応じて真/偽のチェックを取得する必要があるかどうかを引き続き確認できます (たとえば、SQL では、既にテーブルを使用しているため)。
私の見方:「国」コードは変更される可能性があり、国は合併する可能性があり、国は分割される可能性があります。
国が変更または合併された場合、簡単なクエリで住所レコードを更新できます。
国が分かれている場合は、どの住所がどの国の一部であるかを判断する方法が必要です。自動化されたシステムを使用してこれを行うことができます(そして、それについて長い本を書くことができます)。
または
(フォーラムのようなサイトの場合)、アカウントに複数の選択肢を示す撤回された国をまだ持っているユーザーに、ログイン時に国エントリを更新するように依頼することができます。この国では、新しい国のリストからのみ選択できます。撤回されたフィールドに指定されているもの。
この簡略化された国テーブルのセットアップを考えてみてください。
id cc cn withdrawn
1 DE Germany
2 CS Serbia and Montenegro 6,7
3 RH Southern Rhodesia 5
4 NL The Netherlands
5 ZW Zimbabwe
6 RS Serbia
7 ME Montenegro
この例では、country-id 3 のアドレス レコードは、country-id 5 へのクエリで更新され、ユーザーの操作 (またはその他のソリューション) は必要ありません。
ただし、country-id 2 を指定するアドレス レコードは、country-id 6 または 7 を選択するよう求められます (もちろん、ユーザーに表示されるテキストでは、country-name を使用します)、またはカスタムの自動更新ルーチンを実行するために選択されます。
また、「撤回」は繰り返しグループであるため、別のテーブルにすることができます/する必要があります。
このアイデアを (ダウンタイムなしで) シナリオに実装する:
- sql ステートメントを使用して、数値 ID を主キーとして新しい国テーブルを作成します。
- sql ステートメントを使用して、新しいフィールド 'country-id' で住所レコードを更新し、このフィールドに、そのレコードの住所フィールドで指定された国コードに対応する新しい国テーブルからの国 ID を入力します。
- (sql statement to) 撤回されたテーブルを作成し、そこに正しいデータを入力します。
- 次に、フォームにデータを提供するSQLステートメントを書き直します
- チェックを追加し、「国を更新するようユーザーに依頼する」ルーチン
- 新しいフォームを公開しましょう
- 意図しないバグを待つ
- 「住所」テーブルから古い国テーブルと(現在は使用されていない)国コード列を削除します
他の専門家がこのアイデアについてどう思うか非常に興味があります!!