我想比较两个表格,看看员工是否具有足够高的“熟练程度(基本,中级,高级)”,以及正确的“职业”所需的“能力”。每个工作角色将有10个能力,但我认为没有以下表格
列:
jobroleID
,competence1
,proficiency1
,competence2
,proficiency2
.... competence10
,proficiency10
是对的但是下面我的替代方案似乎也是错误的,因为它显示了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
我对此有任何建议。
答案 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。