用户到同一个表中的国家/地区和城市的位置映射

时间:2014-12-29 17:53:42

标签: sql

我有一个用户表,其中包括CityId,StateId,CountryId字段。我想知道将它们[City,State,Country]存储在单独的表中并将它们各自的ID放在User表中或将所有三个实体放在一个表中是不是一个好主意。

虽然前者是常规的,但我担心要加入的额外表格,所以想要将所有这三种不同的位置类型存储在一个表中,如此

RowId - unique row id
LocationType - 1 for City, 2 for state, etc
ActualLocation - Can be a city name if the locationType is 1 and so on..

RowId     LocationType   ActualLocation
1          1                 Waltham
2          1                 Yokohama
3          2                 Delaware
4          2                 Wyoming 
5          3                 US
6          3                 Japan

问题是我只能使用像这样的连接获取所有三个字段的城市名称

select L.ActualLocation as CityName,  
       L.ActualLocation as StateName,
       L.ActualLocation as CountryName      
        from UserTable U,
        AllLocations L
    WHERE 
        (L.ID = U.City and L.LocationType= 1)
    AND
        (L.ID = U.State and L.LocationType = 2)

2 个答案:

答案 0 :(得分:3)

最适合我们的是拥有一个国家/地区表(完全独立的表,可以存储其他国家/地区相关信息,状态表(同上),然后是具有ID的城市表到其他表。

CREATE TABLE Country (CountryID int, Name varchar(50))
CERATE TABLE State (StateID int, CountryID int, Name varchar(50))
CREATE TABLE City (CityID int, StateID int, Name varchar(50))

通过这种方式,您可以使用标准数据库函数强制实施参照完整性,并添加有关每个实体的其他信息,而无需使用大量空白列或“特殊”列。值。

答案 1 :(得分:1)

你实际上需要从你的位置表中选择三次 - 所以你仍然会有连接:

select L1.ActualLocation as CityName,  
   L2.ActualLocation as StateName,
   L3.ActualLocation as CountryName      
    from UserTable U,
    AllLocations L1,
    AllLocations L2,
    AllLocations L3
WHERE 
    (L1.ID = U.City and L1.LocationType= 1)
AND
    (L2.ID = U.State and L2.LocationType = 2)
AND
    (L3.ID = U.Country and L3.LocationType = 3)

<强>无论其 根据你想要做的事情,你可能想要考虑一下这个模型......你可能想要一个包含位置的单独表格&#34; Springfield Missouri&#34;和#34;斯普林菲尔德伊利诺伊州&#34; - 取决于&#34;以及&#34;如果您想管理这些数据,则需要将状态和国家/地区作为单独的相互关联的参考数据进行管理(例如,参见ISO 3361第2部分)。尽管对你来说很可能是过度杀伤,并且最简单的方法就是将用户的文本存储起来 - 而不是&#34;纯粹的&#34;建模,但简化了简单的需求...只需拉动&#34;字&#34;除了复杂的查询之外,进入一个单独的表并不能给你带来更多的东西