Sql 当我为表中的3列设置主键时,查询是否正确? 在我的情况下,我只有一个候选人可能在同一时间与一份工作,所以他们必须是2主键。 然后,一列作为JobApplicationId,用于表CandidateDetail作为外键。

Sql 当我为表中的3列设置主键时,查询是否正确? 在我的情况下,我只有一个候选人可能在同一时间与一份工作,所以他们必须是2主键。 然后,一列作为JobApplicationId,用于表CandidateDetail作为外键。,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,当我决定将上面的3列设置为主键时,这是正确的,还是有其他方法可以解决我的问题 CREATE TABLE Candidate( CandidateId int identity primary key, FullName nvarchar(50) ) CREATE TABLE Job( JobId int identity primary key, JobTitle nvarchar(50) ) CREATE TABLE JobApplication( JobApplicationId int

当我决定将上面的3列设置为主键时,这是正确的,还是有其他方法可以解决我的问题

CREATE TABLE Candidate(
CandidateId int identity primary key,
FullName nvarchar(50)
)

CREATE TABLE Job(
JobId int identity primary key,
JobTitle nvarchar(50)
)

CREATE TABLE JobApplication(
JobApplicationId int identity,
JobId int,
CandidateId int,
CreatedDate datetime,
primary key(JobApplicationId, JobId, CandidateId)
)

CREATE TABLE CandidateDetail(
CandidateDetailId int identity primary key,
JobApplicationId int,
[Description] nvarchar(300)
)

ALTER TABLE JobApplication ADD CONSTRAINT fk_JobApplication_Job FOREIGN KEY (JobId) REFERENCES Job(JobId)
ALTER TABLE JobApplication ADD CONSTRAINT fk_JobApplication_Candidate FOREIGN KEY (CandidateId) REFERENCES Candidate(CandidateId)
ALTER TABLE CandidateDetail ADD CONSTRAINT fk_CandidateDetail_JobApplication FOREIGN KEY (JobApplicationId) REFERENCES JobApplication(JobApplicationId)

与包含三列的主键不同,您可以将JobApplicationId作为主键,并在JobId上设置唯一约束CandidateId


否则,就当前主键方法而言,JobApplicationId=1、JobId=1、CandidateId=1和JobApplicationId=2、JobId=1、CandidateId=1的两行仍然有效,但是对于业务案例来说是无效的。

您可以将JobApplicationId作为主键,并在JobId上设置唯一约束CandidateId,而不是包含三列的主键


否则,JobApplicationId=1、JobId=1、CandidateId=1和JobApplicationId=2、JobId=1、CandidateId=1的两行在当前主键方法中仍然有效,但在业务案例中无效。

从性能和可用性角度来看,复合主键可能会带来麻烦,并会产生性能问题。就个人而言,我会选择JobApplicationId作为主键,因为这是一个标识列,对于每个记录都是唯一的。然后,如果您需要约束该表,以便JobId和CandidateId始终是唯一的,对于任何给定的候选人和他们申请的工作,不允许超过1条记录,那么我将使用复合唯一约束


然而,我建议你更仔细地评估这些要求,因为如果一个候选人在不同的时间段申请同一个职位会怎么样?有理由认为,让同一候选人在该表中多次应用于同一工作可能是有效的数据。

从性能和可用性的角度来看,复合主键可能是一个麻烦,并可能会产生性能问题。就个人而言,我会选择JobApplicationId作为主键,因为这是一个标识列,对于每个记录都是唯一的。然后,如果您需要约束该表,以便JobId和CandidateId始终是唯一的,对于任何给定的候选人和他们申请的工作,不允许超过1条记录,那么我将使用复合唯一约束


然而,我建议你更仔细地评估这些要求,因为如果一个候选人在不同的时间段申请同一个职位会怎么样?毫无疑问,让同一候选人在该表中多次申请同一职位可能是有效的数据。

因此,每当一个人申请某一职位时,都会发布一个新的候选人编号。正当但如果是这样,那么候选者的意思与申请相同。如果不是这样,那么一个候选号码将被重新使用。哪个是正确的?请澄清。请不要太注意桌子的名称,它可以是任何东西。这里我的意思是,当我插入JobId=1和CandidateId=1,然后再次插入它们时,如何解决这个问题。它应该给出一个错误,因为一个应聘者只能申请一个职位。因此,每次一个人应聘一个职位时,都会发布一个新的应聘者编号。正当但如果是这样,那么候选者的意思与申请相同。如果不是这样,那么一个候选号码将被重新使用。哪个是正确的?请澄清。请不要太注意桌子的名称,它可以是任何东西。这里我的意思是,当我插入JobId=1和CandidateId=1,然后再次插入它们时,如何解决这个问题。它应该给出一个错误,因为1个候选人只能申请1个职位。所以,如果我插入两次JobId=1和CandidateId=1,它仍然有效。然而,就我而言,这是不可能的。这意味着一个应聘者不能两次申请一份工作。我刚刚演示了一个示例,其中您的主键仍然有效,包括不需要的数据。因此,我建议使用唯一约束来防止出现这种情况。这也会使复合主键过时,您可以使用JobApplicationId作为主键。确定。我得到了它。感谢您的帮助:-因此,如果我插入两次JobId=1和CandidateId=1,它仍然有效。然而,就我而言,这是不可能的。这意味着一个应聘者不能两次申请一份工作。我刚刚演示了一个示例,其中您的主键仍然有效,包括不需要的数据。因此,我建议使用唯一约束来防止出现这种情况。这也会使复合主键过时,您可以使用JobApplicationId作为主键。确定。我得到了它。感谢您的帮助:-