以下方案的数据库设计

时间:2014-09-15 18:29:05

标签: c# mysql sql sql-server database-design

我正在为以下要求创建数据库架构: 员工具有某些属性。在作业中可以找到这些相同的属性。 我需要做的是根据给定工作的属性搜索员工。例如,"找到所有匹配作业ID = 1并且具有相同属性的员工"。 (用于搜索特定员工的所有工作的Versa副总裁)。这是我的数据库架构。

Job (
   jobId, 
   description
)

Employee(
  employeeId, 
  firstName, 
  lastName,
  startDate,
  email
)

Attribute(
   attributeId,
   description       
)

JobAttribute(
  jobId, (FK to Jobs.jobId)
  attributeId (FK to Attributes.attributeId)
)

EmployeeAttribute(
   employeeId, (FK to Employees.employeeId)
   attributeId (FK to Attributes.attributeId).       
)

查询"找到所有匹配作业ID = 1并且具有相同属性的员工#34;。然后看起来像:

SELECT DiSTINCT e.employeeId 
FROM Employee e
INNER JOIN EmployeeAttribute ea
ON e.attributeId = ea.AttributeId
and e.employeeId = ea.employeeId
WHERE ea.AttributeId In (
Select ja.attributeId 
FROM Job j
inner join JobAttribute ja
    on j.jobId = ja.jobId
inner join AttributeTable at
    on ja.attributeId = at.attributeId
where jobId = 1
)
order by e.startDate asc

该查询将返回至少具有与作业相同的一个属性的所有员工。

如果我需要返回根据使用此架构的作业分配了所有属性的所有员工,查询将如何?

这是一个很好的查询性能设计。我还希望尽可能灵活地允许以最少的代码更改添加新属性。

1 个答案:

答案 0 :(得分:1)

好的,您的第一个查询“找到符合作业ID = 1并且具有相同属性的所有员工”,可以更简单,如下所示

SELECT DISTINCT E.EmployeeId
FROM 
Employee E
INNER JOIN EmployeeAttribute EA ON (EA.EmpId = E.EmployeeId)
INNER JOIN JobAttribute JA ON (EA.AttributeId = JA.AttributeId)
WHERE AJ.JobId = 1

关于检索匹配给定作业的所有属性的员工的查询

SELECT EA.EmployeeId, COUNT(EA.EmployeeId)
FROM EmployeeAttribute EA
INNER JOIN JobAttribute JA on EA.AttributeId = JA.AttributeId
WHERE JA.JobId = @jobId
GROUP BY EA.EmployeeId
HAVING COUNT(EA.EmployeeId) >= (SELECT COUNT(AttributeId) FROM JobAttribute J where J.JobId = @jobId)

您可能需要加入Employee master才能获得该员工的其他详细信息。两个查询都假设派生表上有一个PK,它是两个FK的组合。

在性能方面,使用查询执行计划并相应地定义索引。