【问题标题】:How to build this table optimally, skills per user based on another table如何以最佳方式构建此表,每个用户的技能基于另一个表
【发布时间】:2015-08-25 07:39:58
【问题描述】:

我有一个被“作家”阻止的问题。我正在为 Mysql 中的 Web 应用程序构建数据库。我有两张表,我们称它们为用户和工作。我想要另一张桌子,我们称之为技能。现在我想要的是一种将用户与他们拥有的技能联系起来的方法,以及另一种将工作与那些相同的技能联系起来的方法。在保持一切正常化的同时,我能想到的唯一方法是基本上在每个用户和每个工作上都有一个完整的工作列表。当然这很糟糕,我也无法接受,更何况以后加技能或者删技能简直就是一场噩梦。

那么我该怎么做呢?我唯一必须拥有的是用户表(键 ID UserID)、工作表(键 ID JobId)和技能表(键 ID SkillID),我似乎无法想出添加表\行\或列的解决方案和我肯定在寻求更有知识的人的答案。

【问题讨论】:

  • 您能否添加一个表格样本,即您尝试过的任何表格?
  • 我真的不知道如何将它们格式化为文本以进行可视化。
  • 您可以将其绘制在纸上并嵌入图像/提供其链接。

标签: mysql normalization


【解决方案1】:

您需要两个额外的映射表:user_skills 将具有 UserID 和 SkillID,使用它们的唯一组合作为(主)键。同样,job_skills 将是 JobID 和 SkillID,同样具有组合的唯一键。有了该架构,您需要的任何数据都只需一个简单的查询即可。

【讨论】:

  • 好吧,我不确定这将如何工作,因为如果我将技能用作列,那么我就无法查询它们,可以吗?例如,用户有 userId-其他列技能有技能 ID + 名称 UserSkill 有 UserId-和技能列表(用户不限于一项技能)所以我不知道如何做到这一点,因为我不想使用列表内的列表。
  • 这也是我得出的结论,但是技能需要多对多联系起来(人有不止一种技能,工作可能需要不止一种技能),我唯一能想到的是一个列表......这根本不是一个解决方案,因为它破坏了很多东西。
  • 您将在 user_skills 表上有多行,每个用户和技能组合对应一行。 2列,唯一键在两列上。您可以轻松地搜索用户的所有技能,或所有用户的技能。 job_skills 表也是如此。根据您提供的有限信息,我看不出这个解决方案是如何工作的。
  • 这是我现在所拥有的粗略图片。 imgur.com/QYJhd2O 我想要的是一个表,我可以为使用 userId(key) 的用户列出二进制的技能,对于工作也是如此,以便可以快速完成搜索以查看哪些用户匹配什么工作。也希望它独立构建,所以如果以后添加技能,它不会破坏系统。
  • 在您的示例中,工作需要技能 1、2、5 和 8,而用户只有技能 1、2 和 8,我认为您不希望该用户返回?
【解决方案2】:

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

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

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

GROUP BY the user and job,统计jobs/skills表的不同技能,统计users/skills表的不同技能。

类似这样的:-

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

【讨论】:

  • 非常感谢,我真的不知道为什么我没有看到它,它优雅简单。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2018-04-10
  • 2021-01-15
  • 1970-01-01
  • 2013-08-17
  • 1970-01-01
  • 2017-07-28
  • 2014-09-11
  • 1970-01-01
相关资源
最近更新 更多