这是一个很好的数据库设计实践吗?

时间:2014-11-22 16:00:26

标签: sql

我有一个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唯一的自然键吗?

1 个答案:

答案 0 :(得分:8)

非常好。我建议您为国家/地区设置单独的表格,每个国家/地区只有一行。然后CountryVisits表将具有:

CountryVisitId PrimaryKey,
PersonId ForeignKey, 
CountryId ForeignKey,
VisitDate

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

并且,您应该放宽要求并删除PersonId, CountryId上的唯一或主要密钥,除非您希望每个国家/地区仅执行一次访问。