sql – 数据库设计问题.列值指向不同的表

我要做的事情的描述

我有一个表应该与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表中插入类型条目,并为该类型创建新的详细信息表.现有的表都不需要改变.

点赞