如何以最佳方式构建此表,基于另一个表的每个用户的技能

时间:2015-06-10 07:28:15

标签: mysql normalization

我有一个问题,我有#34;作家"阻止。我正在为Mysql中的Web应用程序构建数据库。我有两张桌子,我们称他们为用户和工作。我想要另一张桌子,让我们称之为技巧。现在我想要的是一种将用户与他们拥有的技能联系起来的方法,以及将工作与这些相同技能联系起来的另一种方式。在保持所有规范化的同时,我能想到的唯一方法就是在每个用户和每个工作上基本上拥有一份完整的工作列表。当然这很糟糕,我不能接受,更不用说将来添加技能或移除技能将是一场噩梦。

那我该怎么做呢?我唯一必须拥有的是用户表(密钥ID UserID),Jobs表(Key ID JobId)和技能表(Key Id skillID),我似乎无法想出一个添加表\行\或列的解决方案我肯定会从更有知识的人那里寻求答案。

2 个答案:

答案 0 :(得分:2)

您需要另外两个映射表:user_skills具有UserIDSkillID,使用其唯一组合作为(主)键。同样,job_skillsJobIDSkillID,再次使用组合的唯一键。有了这个架构,您需要的任何数据都是一个简单的查询。

答案 1 :(得分:0)

完整答案,扩展@shmosel的回复。

有一份用户和技能表,以及另一份工作和技能表。

然后,您可以CROSS JOIN用户和作业以获得每个组合(如果需要,在WHERE子句中缩小范围),并将作业/技能表左键连接到作业。这为您提供了工作和用户的每个组合以及该工作所需的技能。 LEFT OUTER将用户/技能表连接到用户表和作业/技能表。

按用户和工作分组,并计算工作/技能表上的不同技能,并计算用户/技能表上的不同技能。

这样的事情: -

SELECT u.fname,
        j.jobname,
        COUNT(DISTINCT js.skillid),
        COUNT(DISTINCT us.skillid),
        (COUNT(DISTINCT us.skillid) / COUNT(DISTINCT js.skillid)) * 100 AS match_percent
FROM users u
CROSS JOIN jobs j
LEFT OUTER JOIN jobs_skills js  ON j.jobid = js.jobid
LEFT OUTER JOIN users_skills us ON u.userid = us.userid AND js.skillid = us.skillid
GROUP BY u.fname,
        j.jobname

SQL在这里小提琴: -

http://www.sqlfiddle.com/#!9/3d30d/1