我有一个用户表,其中包括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)
答案 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;除了复杂的查询之外,进入一个单独的表并不能给你带来更多的东西