Sql 使用或不使用键作为FK和PK

Sql 使用或不使用键作为FK和PK,sql,tsql,Sql,Tsql,在数据库上,我有以下内容: USERS Id (PK) Name DOCTORS Id (PK) UserId (FK) CurriculumVitae Birthdate ... 所有医生我也是应用程序的用户,但有额外的列,我在一个页面上显示所有医生 将Id和用户Id放在医生表上有意义吗 或者我应该让UserId同时成为表医生的主键和FK: DOCTORS UserId (PK, FK) CurriculumVitae Birthdate ... 您认为我什么时候应该选择此选项?是的,您

在数据库上,我有以下内容:

USERS
Id (PK)
Name

DOCTORS
Id (PK)
UserId (FK)
CurriculumVitae
Birthdate
...
所有医生我也是应用程序的用户,但有额外的列,我在一个页面上显示所有医生

将Id和用户Id放在医生表上有意义吗

或者我应该让UserId同时成为表医生的主键和FK:

DOCTORS
UserId (PK, FK)
CurriculumVitae
Birthdate
...

您认为我什么时候应该选择此选项?

是的,您可以将
用户ID
(如您所定义)同时作为主键和外键。主键指定它在表中是唯一的。外键将其映射回
Users

这是一个子集关系的示例


实际上,我会调用列
Users.UserId
DoctorId
。我认为这是较少混淆的术语,它抓住了这两列中最重要的方面。但是,实际名称对于您的问题并不重要(您的名称是合理的)。

是的,您可以将
UserId
(如您所定义的)同时作为主键和外键。主键指定它在表中是唯一的。外键将其映射回
Users

这是一个子集关系的示例


实际上,我会调用列
Users.UserId
DoctorId
。我认为这是较少混淆的术语,它抓住了这两列中最重要的方面。然而,实际的名字对你的问题并不重要(你的名字是合理的).

如果您没有将其作为PK,那么您可能会有可能不是您想要的副本。

如果您没有将其作为PK,那么您可能会有可能不是您想要的副本。

这两列是否总是相同的?还是医生有一个
用户Id
以及一个单独的
Id
?@mypetlion我相信这就是问题所在。要在两个表中都有一个id,还是一秒钟?我可以想象医生与用户之间是一对一的关系(多个用户不能是同一个医生,除非我遗漏了什么)。在这种情况下,将UserId设置为PK和FK是有意义的。我也会考虑移动生日日期给用户,因为所有的用户都有生日…User.Id和Doctor.Id都被定义为“int-identity”。这是否回答了你的问题?这两列是否总是相同的?还是医生有一个
用户Id
以及一个单独的
Id
?@mypetlion我相信这就是问题所在。要在两个表中都有一个id,还是一秒钟?我可以想象医生与用户之间是一对一的关系(多个用户不能是同一个医生,除非我遗漏了什么)。在这种情况下,将UserId设置为PK和FK是有意义的。我也会考虑移动生日日期给用户,因为所有的用户都有生日…User.Id和Doctor.Id都被定义为“int-identity”。这回答了你的问题吗?是的,Java ORMs通常可以将这些表映射为一个从另一个表继承的表。我相信其他语言也有类似的功能。是的,Java ORMs通常可以将这些表映射为从另一个表继承的表。我相信其他语言也有类似的功能。