数据库表重复行中的数据

时间:2014-11-16 11:19:16

标签: database database-design many-to-many relational-database

我想比较两个表格,看看员工是否具有足够高的“熟练程度(基本,中级,高级)”,以及正确的“职业”所需的“能力”。每个工作角色将有10个能力,但我认为没有以下表格

列:

jobroleIDcompetence1proficiency1competence2proficiency2 .... competence10proficiency10是对的但是下面我的替代方案似乎也是错误的,因为它显示了10行重复列jobroleID

表1工作角色要求

jobroleID, JRCompetence, JRProficiencyLevel

001        205             intermediate
001        207             basic
001        301             advanced
etc
002        

表2员工当前能力

EmployeeID, EmployeeCompetence, EmployeeProficiencyLevel
E1234       205                 intermediate
E1234       207                 basic
E1234       555                 basic
etc

我对此有任何建议。

1 个答案:

答案 0 :(得分:0)

我认为你的基本设计很好。当您规范化数据库时,重复行是一个自然的结果,因此每个表只包含有关实体的信息,并且您可以模拟多对多关系,例如员工和能力/级别,以及具有熟练程度的工作和能力。此设计可以轻松添加新要求 - 您只需在作业要求表中添加新行。

您的替代设计需要您在需要添加新技能时添加新列,并修改所有依赖于表格的查询 - 显然这并不理想。

然而,我会改变设计,以便将熟练程度存储在一个单独的表中,这样可以使序数比较更容易(因此1 =基本,2 =中间,3 =高级)。

查询哪些员工具有特定工作所需技能的查询可能如下所示:

-- list emps who has can do job 001:
SELECT EmployeeID
FROM employee_current_capability ecc1
WHERE NOT EXISTS (
    SELECT *
    FROM job_role_requirements jrr
    WHERE jrr.jobroleID = 001
    AND NOT EXISTS (
       SELECT *
        FROM employee_current_capability ecc2
        WHERE ecc1.EmployeeID = ecc2.EmployeeID
        AND ecc2.EmployeeCompetence = jrr.JRCompetence
        AND ecc2.EmployeeProficiencyLevel >= jrr.JRProficiencyLevel
       )
    )
GROUP BY ecc1.EmployeeID;

有关示例,请参阅此SQL Fiddle