我正在处理的一个 Web 应用程序遇到了一个意外的“错误”——该应用程序的数据库有两个表(以及许多其他表),分别称为“States”和“Cities”。
' States ' 表字段:
-------------------------------------------
idStates | State | Lat | Long
-------------------------------------------
' idStates ' 是一个自动递增的主键。
“城市”表字段:
----------------------------------------------------------
idAreaCode | idStates | City | Lat | Long
----------------------------------------------------------
' idAreaCode ' 是一个主键,由国家代码 + 区号组成(例如 91422,其中 91 是印度的国家代码,422 是印度城市的区号)。“ idStates ”是从“ States ”表派生的外键,用于将“ Cities ”表中的每个城市与其对应的州相关联。
我们认为国家代码+地区代码组合对于每个城市都是唯一的,因此可以安全地用作主键。一切正常。但是印度的一个地方在 db 设计中发现了一个意想不到的“缺陷”——印度和美国一样是联邦民主国家,在地理上分为许多州或联邦领土。州和联邦领土数据都存储在“州”表中。然而,有一个地方——昌迪加尔——属于两个州(哈里亚纳邦和旁遮普邦),它本身也是一个联邦领土。
显然,当前的 db 设计不允许我们存储多个城市“ Chandigarh ”的记录。
建议的解决方案之一是创建一个组合列“ idAreaCode ”和“ idStates ”的主键。
我想知道这是否是最好的解决方案?
(仅供参考:我们正在使用带有 InnoDB 引擎的 MySQL)。
更多信息:
- 该数据库存储每个城市的气象信息。因此,州和城市是每个查询的起点。
- 每天使用 CSV 文件插入每个城市的新数据。CSV 文件包括用于标识每条记录的 idStates(用于州)和 idAreaCode(用于城市)列。
- 数据库规范化对我们很重要。
注意:没有为 city 表使用自动递增主键的原因是数据库每天/每小时使用 CSV 文件(由另一个应用程序生成)更新。并且 CSV 文件中的每条记录都由 idStates 和 idAreaCode 列标识。因此,即使表被删除并再次刷新,城市表中使用的主键对于每个城市都是相同的。邮政编码(或 PIN 码)和区号(或 STD 代码)符合唯一、静态(不经常更改)的标准,并且这些现成的列表很容易获得。(我们现在决定使用区号,因为印度正在将其密码更新为新格式)。
我们决定的解决方案是在应用程序级别处理此问题,而不是更改数据库设计。在数据库中,我们将只存储“Chandigarh”的一条记录。在应用程序中,我们为任何搜索“Chandigarh, Punjab”或“Chandigarh, Haryana”创建了一个标志,以将搜索重定向到该记录。是的,这并不理想,但这是一个可以接受的折衷方案,因为这是迄今为止我们遇到的唯一例外。