我有几张表格代表地理实体(CITIES
,COUNTIES
,ZIPCODES
,STATES
,COUNTRIES
等等。
我需要表示一组地理实体。集合可以包含来自多个表的记录。例如,一组可能包含来自CITIES
的3条记录,来自COUNTIES
的1条记录和来自COUNTRIES
的4条记录。
以下是两种可能的解决方案:
set_id INT, foreign_table VARTEXT(255), foreign_id INT
第5集的示例条目:
(5,'CITIES',4)
(5,'CITIES',12)
(5,'ZIPCODES',91)
(5,'ZIPCODES',92)
(5,'COUNTRIES',15)
set_id INT,cities TEXT,counties TEXT,zipcodes TEXT,states TEXT,countries TEXT
所以上面的集合将用一个记录
表示
(5,'4,12','','91,92','','15')
还有其他想法吗?很想听听你的意见。 谢谢!
答案 0 :(得分:2)
您提出的两种解决方案都没有真正的外键。在第一个解决方案中,一个foreign_id可以指向许多表,这对于数据库来说是很难(或者至少是低效的)。第二个解决方案将多个值存储在一列中,这是每个人都同意你不应该做的事情(它会中断first normal form。)
我要做的是:城市,邮政编码和州都“拥有”地理位置。实现它的正常方式是一对多关系。创建地理位置表,并将geolocation_id列添加到城市,邮政编码和州表中。
编辑:根据您的评论,从地理位置到其城市:
select *
from geolocation g
left join cities c
on g.id = c.geolocation_id
left join zipcodes z
on g.id = z.geolocation_id
....
数据库将使用外键索引来解析连接,这非常快。
答案 1 :(得分:2)
Location Set
可以有多个Geography
个项目Geography
项可以属于许多Location Sets
关于Geography
项目表,有两种方法可行。在第一种情况下,超类型/子类型关系是重叠的 - 可以将多个子类型链接到超类型。
例如,GeographyID = 5
和Geography
表格中可以Zipcodes, Cities, States, Countries
。
在第二种情况下,我们可以考虑独占(不相交)关系,其中只有一个子类型可以连接到超类型。父子关系用于创建路径,如ZIP/City/State/Country
- 即实际管理区域允许这种类型的关系。
在此示例中,GeographyID = 5
中只能有Geography
,而且只有一个子类型表。