数据库设计问题。指向不同表

时间:2016-08-23 08:59:59

标签: sql database database-design

我必须做的事情的描述

我有一个与table

相关的Table1 OR Table2 OR Table3

例如,有一个表Employees,它有: Id, Name, Address, Age, Salary, EmployerId

第二个表格是RegisterEmployeeRequirementsId, RequirementType, EmployerId, EntryId

需求类型可以是CreditStatusRequirementEmployeeDegreeRequirement)。

问题CreditStatusRequirement包括CreditStatus获取日期(检查是否是去年) 。我还有一个名为CreditStatusRequirements的附加表,其中包含列:

CreditStatusDateTimeAcquired

另一方面,度要求具有以下属性:DegreeName and MinGpa

为了解决这个问题,我创建了另一个具有这些属性的表。如果RegisterEmployeeRequirements中的需求类型为CreditStatusRequirement,我将使用entryId列查看CreditStatusRequirements表,然后检查它是否已完成。

否则,如果是EmployeeDegreeRequirement,我将使用entryId列查看DegreeRequirements表。我认为使用像entryId这样的列是不太好的做法。

解决此架构问题的方法是什么?

2 个答案:

答案 0 :(得分:1)

这很简单。在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表中插入类型条目,并为该类型创建新的详细信息表。现有的表都不需要改变。

答案 1 :(得分:0)

为什么不仅仅使用单独的表来获取信用状态和学位要求,并且不需要RequirementType列?

RegisterEmployeeCreditStatusRequirements具有: IdEmployerIdCreditStatusDateTimeAcquired

RegisterEmployeeEmployeeDegreeRequirements具有: IdEmployerIdDegreeNameMinGpa