10

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

这是我的国家表:

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

我的问题是,唯一拥有 state 字段的国家是美国。所有其他城市都有一个空值。

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

我认为这只会使事情复杂化,因为我有两张城市表。

我该如何改进这个设计?

4

3 回答 3

8

为什么不去关系?

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

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

于 2012-06-10T18:40:32.830 回答
6

为什么不是标准的三向链接表集?

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)
);

这在大多数情况下都适用,除了一些像萨斯喀彻温省劳埃德明斯特这样的退化的情况,它跨越了两个省界。

于 2012-06-10T18:39:00.747 回答
1

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

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

如果您采用非规范化路线,您将需要应用程序逻辑来确保您的外键彼此一致。

如果您采用虚拟状态记录路线,您将需要应用程序逻辑来确保在用户界面中对用户隐藏虚拟层。

于 2012-06-10T18:44:12.270 回答