如何从单独的表中表示一组实体?

时间:2009-12-18 23:17:20

标签: sql database-design data-modeling normalization

我有几张表格代表地理实体(CITIESCOUNTIESZIPCODESSTATESCOUNTRIES等等。

我需要表示一组地理实体。集合可以包含来自多个表的记录。例如,一组可能包含来自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)

  • 一个表,其中包含每个实体类型的TEXT列,其中包含一个包含相应条目的字符串:
  

set_id INT,cities TEXT,counties TEXT,zipcodes TEXT,states TEXT,countries TEXT

     

所以上面的集合将用一个记录

表示      

(5,'4,12','','91,92','','15')

还有其他想法吗?很想听听你的意见。 谢谢!

2 个答案:

答案 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 = 5Geography表格中可以Zipcodes, Cities, States, Countries

geography_model_01



在第二种情况下,我们可以考虑独占(不相交)关系,其中只有一个子类型可以连接到超类型。父子关系用于创建路径,如ZIP/City/State/Country - 即实际管理区域允许这种类型的关系。

在此示例中,GeographyID = 5中只能有Geography,而且只有一个子类型表。

geography_model_02