我有一个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
唯一的自然键吗?
答案 0 :(得分:8)
非常好。我建议您为国家/地区设置单独的表格,每个国家/地区只有一行。然后CountryVisits
表将具有:
CountryVisitId PrimaryKey,
PersonId ForeignKey,
CountryId ForeignKey,
VisitDate
这将确保国家/地区名称始终拼写正确且一致。如果您想要开始使用国家/地区列表,请查看此Wikipedia页面。另请注意,您对国家/地区的定义可能与标准国家/地区列表不同(实际上有几个国家/地区),因此您应使用自己的自动递增主键,而不是使用国家/地区代码。
并且,您应该放宽要求并删除PersonId, CountryId
上的唯一或主要密钥,除非您希望每个国家/地区仅执行一次访问。