为什么您仍想显示(例如)带有旧国家代码的客户地址?
如果我理解正确,您目前仍然有指向“塞尔维亚和黑山”的“地址”记录。我认为,如果您解决了该问题,那么您当前的问题将不存在。
“国家”一词可能有点误导:并非 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
在此示例中,国家 ID 为 3 的地址记录通过对国家 ID 5 的查询进行更新,无需用户交互(或其他解决方案)。
但是,指定 country-id 2 的地址记录将被要求选择 country-id 6 或 7(当然在呈现给用户的文本中,您使用国家名称)或选择执行您的自定义自动更新例程。
另请注意:“撤回”是一个重复组,因此您可以/应该将其放入单独的表格中。
在您的场景中实施此想法(无需停机):
- sql 语句以数字 id 作为主键构建一个新的国家/地区表。
- sql 语句使用新字段“country-id”更新地址记录,并使用与该记录的地址字段中指定的国家/地区代码对应的新国家/地区表中的国家/地区 ID 填充此字段。
- (sql 语句)创建撤回的表并在其中填充正确的数据。
- 然后重写为表单提供数据的 sql 语句
- 添加检查并“要求用户更新国家/地区”-例程
- 让新形式上线
- 等待/查看意外错误
- 从“地址”表中删除旧的国家/地区表和(现在未使用的)国家/地区代码列
我很好奇其他专家对这个想法的看法!!