如何以最佳方式构建此 table,每个用户的技能基于另一个 table
How to build this table optimally, skills per user based on another table
我有一个问题 "writers" 阻止了。我正在 Mysql 中为 Web 应用程序构建数据库。我有两个 table,我们称它们为用户和工作。我想要另一个 table ,我们称之为技能。现在我想要的是一种让 link 用户掌握他们拥有的技能的方法,以及另一种让 link 工作掌握这些相同技能的方法。在保持一切正常化的同时,我能想到的唯一方法是基本上拥有每个用户和每个工作的完整工作列表。当然这很糟糕,我不能接受table,更何况以后添加技能或删除技能都是一场噩梦。
那么我该怎么做呢?我唯一必须拥有的是一个userstable(key ID UserID),Jobstable(Key ID JobId)和一个skillstable(Key Id skillID),我好像不能来提出一个添加 tables\rows\or 列的解决方案,我肯定会从更有知识的人那里寻求答案。
您需要两个额外的映射表:user_skills
将具有 UserID
和 SkillID
,使用它们的唯一组合作为(主)键。类似地,job_skills
将 JobID
和 SkillID
,同样使用组合的唯一键。有了该模式,您需要的任何数据都可以通过简单的查询获得。
完整答案,扩展@shmosel 的回复。
拥有 table 用户和技能,以及 table 工作和技能。
然后您可以 CROSS JOIN 用户和工作以获得每个组合(如果需要,在 WHERE 子句中缩小范围),然后 LEFT OUTER JOIN 工作/技能 table 到工作。这为您提供了工作和用户的各种组合,以及该工作所需的技能。 LEFT OUTER JOIN 用户/技能 table 到用户 table 和工作/技能 table。
GROUP BY 用户和工作,并计算工作/技能上的不同技能table,并计算用户/技能上的不同技能table。
像这样:-
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 fiddle 在这里:-
我有一个问题 "writers" 阻止了。我正在 Mysql 中为 Web 应用程序构建数据库。我有两个 table,我们称它们为用户和工作。我想要另一个 table ,我们称之为技能。现在我想要的是一种让 link 用户掌握他们拥有的技能的方法,以及另一种让 link 工作掌握这些相同技能的方法。在保持一切正常化的同时,我能想到的唯一方法是基本上拥有每个用户和每个工作的完整工作列表。当然这很糟糕,我不能接受table,更何况以后添加技能或删除技能都是一场噩梦。
那么我该怎么做呢?我唯一必须拥有的是一个userstable(key ID UserID),Jobstable(Key ID JobId)和一个skillstable(Key Id skillID),我好像不能来提出一个添加 tables\rows\or 列的解决方案,我肯定会从更有知识的人那里寻求答案。
您需要两个额外的映射表:user_skills
将具有 UserID
和 SkillID
,使用它们的唯一组合作为(主)键。类似地,job_skills
将 JobID
和 SkillID
,同样使用组合的唯一键。有了该模式,您需要的任何数据都可以通过简单的查询获得。
完整答案,扩展@shmosel 的回复。
拥有 table 用户和技能,以及 table 工作和技能。
然后您可以 CROSS JOIN 用户和工作以获得每个组合(如果需要,在 WHERE 子句中缩小范围),然后 LEFT OUTER JOIN 工作/技能 table 到工作。这为您提供了工作和用户的各种组合,以及该工作所需的技能。 LEFT OUTER JOIN 用户/技能 table 到用户 table 和工作/技能 table。
GROUP BY 用户和工作,并计算工作/技能上的不同技能table,并计算用户/技能上的不同技能table。
像这样:-
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 fiddle 在这里:-