我必须做的事情的描述
我有一个与table
Table1 OR Table2 OR Table3
例如,有一个表Employees
,它有:
Id,
Name,
Address,
Age,
Salary,
EmployerId
第二个表格是RegisterEmployeeRequirements
:
Id,
RequirementType,
EmployerId,
EntryId
。
需求类型可以是CreditStatusRequirement
或EmployeeDegreeRequirement
)。
问题:CreditStatusRequirement
包括CreditStatus
和获取日期(检查是否是去年) 。我还有一个名为CreditStatusRequirements
的附加表,其中包含列:
CreditStatus
,
DateTimeAcquired
另一方面,度要求具有以下属性:DegreeName and MinGpa
。
为了解决这个问题,我创建了另一个具有这些属性的表。如果RegisterEmployeeRequirements
中的需求类型为CreditStatusRequirement
,我将使用entryId
列查看CreditStatusRequirements
表,然后检查它是否已完成。
否则,如果是EmployeeDegreeRequirement
,我将使用entryId
列查看DegreeRequirements
表。我认为使用像entryId
这样的列是不太好的做法。
解决此架构问题的方法是什么?
答案 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
具有:
Id
,EmployerId
,CreditStatus
,DateTimeAcquired
表RegisterEmployeeEmployeeDegreeRequirements
具有:
Id
,EmployerId
,DegreeName
,MinGpa