2014-12-29 22 views
0

我有一個用戶表,其中包含字段CityId,StateId,CountryId。我想知道是否將它們[城市,州,國家]存儲在單獨的表中並將它們各自的ID放在用戶表中或將所有三個實體放在一個表中是個好主意。用戶到位置映射與同一個表中的國家和城市

前者是傳統的,我關心的額外的表的加入,所以會想所有這三個不同的位置,類型存儲在一個表像這樣

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) 

回答

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

這種方式,你可以使用標準的數據庫功能實施參照完整性並添加有關每個實體的附加信息,而無需一堆空白列或'特殊'的價值。

+0

絕對是一種更「正確」的方式來做到這一點......但是,它爲正確管理全球地理參考數據(國家邊界變化,州來來去去,城市變更名稱)增加了很多開銷。 – Captain

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) 

無論其 根據要與此做什麼,你可能要考慮一下模型......你可能需要一個單獨的表,將包含位置「密蘇里州斯普林菲爾德」和「伊利諾伊州斯普林菲爾德」 - 取決於你希望管理這些數據的「好」,你需要將這些州和國家作爲獨立的相互關聯的參考數據進行管理(例如參見ISO 3361第2部分)。儘管你可能會過度使用它,但最簡單的方法就是將用戶的文本存儲到用戶中 - 而不是「純粹」的建模,但是爲簡單的需要而簡化了很多,只需將「單詞」拖到單獨的表中即可除了複雜的查詢外,並不能真正爲您提供更多的幫助