设计城市,州,国家/地区表的最佳方式是什么?

时间:2012-06-10 18:35:01

标签: mysql database normalization

我需要帮助设计我的国家,城市,州表。我将从我的表格中提供样本数据,以便您可以更好地解决我的问题。

这是我的国家/地区表:

Country
______
code   name
US     United States
SG     Singapore
GB     United Kingdom

这是我的城市表:

City
_____
id   country   city        state
1    US        Birmingham  Alabama
2    US        Auburn      Alabama
.
.
29   GB        Cambridge   NULL
30   GB        Devon       NULL

我的问题是,唯一拥有州领域的国家是美国。所有其他城市都有空值。

我的临时解决方案是为美国创建一个特殊的城市表,然后所有其他国家/地区都有另一个没有州字段的城市表。

我认为这只会使问题复杂化,因为我有两个城市表。

如何改进此设计?

3 个答案:

答案 0 :(得分:7)

为什么不去关系?

Country ( CountryID, CountryCode, CountryName )
Region  ( RegionID, RegionCode, RegionName, CountryID )
City    ( CityID, CityCode, CityName, RegionID )

'Region'这个名称比State更通用,这意味着它可能在任何地方都更有意义。

答案 1 :(得分:4)

为什么不设置标准的3向链接表?

table country (
   id   int primary key,
   name varchar(255)
);

table state (
    id int primary key,
    name varchar(255),
    country_id int foreign key country (id)
);

table city (
    id int primary key,
    name varchar(255)
    state_id int foreign key state (id)
);

对于大多数情况来说,这是有用的,除了像Lloydminster, Saskatchewan这样跨越两个省界的一些堕落的情况。

答案 2 :(得分:0)

除了美国之外,还有很多国家在国家和市级之间存在政治分歧。澳大利亚有州,加拿大有省,日本有县等。

问题是如何跟踪这些信息并保持一致?对于没有中间级别的国家,您可以在中间级别拥有“虚拟记录”。处理此问题的另一种方法是将所有级别的外键归一化到包含该地址的实体。如果国家和城市是强制性的,那么他们的外键将不可为空,而你的州FK可以为空。

如果你去反规范化路由,你需要应用程序逻辑来确保你的外键彼此一致。

如果你进入虚拟状态记录路由,你将需要应用程序逻辑来确保在用户界面中隐藏虚拟层。