2014-11-22 58 views
1

我拿到了Person表,每个Person都可以访问几个国家。每个Person访问的国家存储在表CountryVisit这是一个很好的数据库设计实践吗?

PersonId, 
Name 

地区访问

CountryVisitId (primary key) 
PersonId (foreign key to 'Person.PersonId') 
CountryName 
VisitDate 

对于CountryVisit表,我的主键是CountryVisitId这是一个identity栏。这种设计将导致Person只能有1 CountryVisit,但CountryVisitId可以是40。创建另一个代理键列作为标识列是否是一种更好的做法,而CountryVisitId是每个PersonId都唯一的自然键?

+2

为什么不把'person','country'作为独立的表和映射表'CountryVisit'?这样你可以确保国家在拼写方面没有变化。 – davek 2014-11-22 16:04:25

+0

是的,那是在我原来的设计中,我只是在这里做了一个更简单的设计来澄清我的问题 – user3340627 2014-11-22 16:05:44

+1

如果用户多次访问同一个国家,您想存储什么? IE:这是1-n还是n-n关系? – 2014-11-22 16:06:46

回答

8

这很不错。我建议你为国家建立一个单独的表格,每个国家一行。然后CountryVisits表将具有:

CountryVisitId PrimaryKey, 
PersonId ForeignKey, 
CountryId ForeignKey, 
VisitDate 

这将确保该国的名字总是正确和一致无误。如果您想要开始一个国家/地区列表,请查看Wikipedia页面。另外请注意,您的国家定义可能与标准国家/地区列表不同(国家/地区实际上有多个国家/地区),因此您应该使用自己的自动递增主键,而不是使用国家/地区代码。

而且,您应该放宽要求并删除PersonId, CountryId上的唯一或主键,除非您希望每个国家只实施一次访问。