我要做的事情的描述
我有一个表应该与Table1或Table2或Table3相关
例如,有一个Employees表,它有:
ID,
名称,
地址,
年龄,
薪水,
EmployerId
第二个表是RegisterEmployeeRequirements:
ID,
RequirementType,
EmployerId,
ENTRYID.
需求类型可以是CreditStatusRequirement或EmployeeDegreeRequirement).
问题:CreditStatusRequirement包括CreditStatus及其获取日期(以检查它是否在去年).我还有一个名为CreditStatusRequirements的附加表,其中包含列:
CreditStatus,
DateTimeAcquired
另一方面,具有以下属性的度要求:DegreeName和MinGpa.
为解决此问题,我创建了另一个具有这些属性的表如果RegisterEmployeeRequirements中的需求类型是CreditStatusRequirement,我将使用entryId列查看CreditStatusRequirements表,然后检查它是否已完成.
否则,如果它是EmployeeDegreeRequirement,我将使用entryId列来查看DegreeRequirements表.我想使用像entryId这样的列不是一个好习惯.
解决此架构问题的方法是什么?
最佳答案 这很简单.在RegisterEmployeeRequirements表中没有FK等效项.让每个Credit和Degree要求中的FK详细记录表到RegisterEmployeeRequirements.
像这样:
create table RegisterEmployeeRequirements(
EmployeeId int references ( ID ),
RequirementType char( 1 ) not null,
..., -- Other common fields
constraint PK_RegisterEmployeeRequirements primary key( EmployeeID, RequirementType ),
constraint FK_RegisterEmployeeRequirements_Empe( EmployeeId )
references Employees( ID ),
constraint FK_RegisterEmployeeRequirements_Type( RequirementType )
references RequirementTypes( ID ),
);
请注意,密钥是员工ID和需求ID的组合.这可确保每个员工在两个定义的要求中不得超过一个.我认为这符合您的数据库要求.
然后,每个需求详细信息表可以定义如下:
create table CreditRequirements(
EmployeeId int primary key,
RequirementType char( 1 ) check( CreditType = 'C' ),
Status ...,
Acquired datetime,
constraint FK_CreditRequirements_Emp foreign key( EmployeeID, RequirementType )
references RegisterEmployeeRequirements( EmployeeID, RequirementType )
);
create table DegreeRequirements(
EmployeeId int primary key,
RequirementType char( 1 ) check( DegreeType = 'D' ),
DegreeName varchar( 64 ),
MinGPA float,
constraint FK_DegreeRequirements_Emp foreign key( EmployeeID, RequirementType )
references RegisterEmployeeRequirements( EmployeeID, RequirementType )
);
信用详细信息表中的条目只能用于在RegisterEmployeeRequirements表中具有信用类型条目的员工.与RegisterEmployeeRequirements中的度数类型条目的度数详细信息表相同.在RegisterEmployeeRequirements中只能插入每种类型的要求中的一种,并且每个雇员只能在每个详细信息表中插入一个条目.
您的数据完整性合理,设计可扩展.如果创建了第三个需求类型,则会在RequirementTypes表中插入类型条目,并为该类型创建新的详细信息表.现有的表都不需要改变.