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

时间:2017-12-13 15:18:45

标签: 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,
    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)
 );

2 个答案:

答案 0 :(得分:1)

将此视为长格式的评论。

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

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

另外,在你的工资表中,做一些事情来说明小工具制造商可能会比挖沟工人的工资更高。即使现在情况并非如此,也可能是晚些时候。

最后,向Employee添加一个非空列,并使其成为Salary的外键。

答案 1 :(得分:1)

此类工资表通常配置为工资范围工资等级。通常,这可以表示为范围而不是特定数量。根据您的薪资范围的制定程度,您可能需要页眉和页脚,例如"工资带5" (标题)为1年或更多(详细)经验支付50,000美元,3年或更长时间支付52,000美元,5年或更长时间支付55,000美元(详情)。

如果要求是能够根据一套简单的标准(经验长度,T1,T2(无论它们是什么))计算出员工的薪酬或应该支付的金额,那么你应该有一个薪资等级表,其中有一个唯一的候选键,由任何描述薪酬等级水平的决定因素组成。这也可以有另一个主键,比如使外键变得更简单的代理键,但是您仍然需要能够根据可以在员工表上查找的业务决定因素缩小到薪资等级表中的一行。