Sql 如何将非主键或非唯一键设置为外键

Sql 如何将非主键或非唯一键设置为外键,sql,database-design,Sql,Database Design,在薪资表中,我不能将WorkExperience T1、T2设置为外键,因为它们不是Employee表的主键或唯一键。我现在能做什么 create table Employee( IdNo int primary key Foreign key References Person (IdNo), WorkExperience int, PortalNo varchar(3), T1 bit NOT NULL, T2 bit NOT NULL, CO

在薪资表中,我不能将WorkExperience T1、T2设置为外键,因为它们不是Employee表的主键或唯一键。我现在能做什么

create table Employee(
    IdNo int primary key Foreign key References Person (IdNo),
    WorkExperience int,
    PortalNo varchar(3),
    T1 bit NOT NULL,
    T2 bit NOT NULL,
    CONSTRAINT FK_Person FOREIGN KEY (IdNo)
    REFERENCES Person(IdNo)
 );


 create table Salary (
    WorkExperience int,
    T1 bit NOT NULL,
    T2 bit NOT NULL,
    BasicSalary Smallmoney,
    PRIMARY KEY (WorkExperience,T1,T2),
    FOREIGN KEY (WorkExperience,T1,T2) REFERENCES Employee(WorkExperience,T1,T2)
 );

将其视为长格式注释

首先,Employee.WorkExperience是一个不好的字段,因为它会随着时间的推移而变化。您最好使用日期字段,指示原始雇用数据和/或他开始当前职位的日期

接下来,在薪资表中,添加一个autoincrement或uuid字段,并将其用作主键。在工作经验T1和T2上创建唯一约束。顺便说一下,为这些字段提供更具描述性的名称

此外,在你的工资表中,做一些事情来说明一个事实,即小部件制造商可能会获得与挖沟工不同的工资。即使现在不是这样,以后也可能是这样


最后,向Employee添加一个NOTNULL列,并将其作为薪资的外键。

这种类型的薪资表通常配置为薪资带薪资等级。通常,这可能表示为一个范围,而不是一个特定的数量。根据您的薪资范围的规定,您可能需要一个页眉和页脚,例如“工资级别5”(页眉)为1年或1年以上的工作经验支付50000美元(详细信息),为3年或3年以上支付52000美元,为5年或5年以上支付55000美元(详细信息)


如果要求能够根据一组简单的标准(经验长度、T1、T2(无论是什么))计算出员工的薪酬或他们应该支付的薪酬,那么您应该有一个薪酬等级表,该表有一个唯一的候选关键字,由描述薪酬等级级别的任何决定因素组成。它还可以有另一个主键,如代理键,以简化外键,但是,您仍然需要能够根据可以在员工表中查找的业务决定因素,将薪资等级表缩小到一行。

外键只能引用主键或唯一约束。可能
T1
T1
要求将其赢得的表视为听起来像的对象他们是。然后该表可以作为
员工
表和
工资
表的外键?您试图创建的设计似乎毫无意义。JNevill的建议听起来像是你想要的,尽管很难确定。员工和工资应该在什么基础上联系起来?逻辑是什么?当然,员工的工资只是您在其记录的字段中输入的值。除非它基于分级系统……在这种情况下,只需在薪资表中生成一个唯一的SalaryID列作为主键,并在员工中使用该列作为外键。T1、T2等字段将只是该薪资级别的属性。也许这样效果更好?将非主要或非唯一设置为外键表示您的设计不是以正常形式进行的。