我正在开发一个应用程序,其中我必须处理一个名为“技能”的实体。现在的问题是,“技能A”可以与“技能B”具有一定的相关性(这种相关性用于搜索目的)。类似地,“技能B”也可以与“技能C”相关。我们目前有以下数据模型来表示这个场景
技能{SkillId,SkillName}
RelevantSkill {SkillId,RelevantSkillId,RelevanceLevel}
现在,在上面的场景中,我们有了“技能A”和“技能C”之间的隐式关系。此场景的最佳数据模型是什么?在执行搜索时,我们还必须遍历此层次结构。
发布于 2009-04-10 12:13:21
您所要求的似乎基本上是一个从一组成对距离计算得出的图距离算法(斜杠数据结构)。一个合理的(并且可以很好地计算的)指标是commute time。
可以这样认为:构建一个图,其中每个节点都是一项技能,每条边代表它彼此连接的节点的相关性。现在想象一下,您从图中的某个节点开始(一些技巧),然后沿着定义的边随机跳到其他节点。假设从技能A跳到技能B的概率与这些技能之间的相关性成正比(通过这些技能与其他技能的相关性来归一化...)。现在,通勤时间表示从技能A到技能C所需的平均步数。
这具有一个非常好的特性,即在两个节点之间添加更多路径会缩短通勤时间:如果技能A和B、B和C、C和D以及D和A相关,那么A和C之间的通勤时间将变得更短。此外,使用稀疏连接技能图的特征值分解可以非常容易地计算通勤时间(我认为我给你的参考资料说明了这一点,但如果不是这样的话,还有很多可用的)。
如果您希望实际存储任意技能对之间的通勤时间,则需要一个完全连接的图或NxN矩阵(N是技能的数量)。然而,一个更好的变体是,如上所述,丢弃所有弱于某个阈值的连接,然后将稀疏连接图作为行存储在数据库中。
祝你好运,我希望这对你有帮助!
发布于 2009-03-31 11:22:57
你最好的选择是:
ImplicitRelevance
布尔列:RelevantSkill {SkillId, RelevantSkillId, RelevanceLevel, ImplicitRelevance}
RelevantSkill
表中)对应于所有隐式(间接)相关关系的行(例如当且仅当计算的RelevanceLevel
高于设定的阈值时,技能A“->”“技能C")与其相应的计算RelevanceLevel
。这些行应将ImplicitRelevance
设置为true
skill_a_id, skill_b_id, computed_level, 'T'
如果对显式相关性级别(指标)进行了任何更改,请使用ImplicitRelevance=true删除所有行,然后重新计算(重新插入)它们。
发布于 2009-03-31 13:30:14
你的解释留下了一些开放的东西,那就是在间接(“隐含”)关系的情况下,相关性级别是如何组合的。例如,如果技能A与级别3的技能B相关,而技能B与级别5的技能C相关,那么技能A与技能C的间接相关性的级别(以数字形式)是什么?
正确的数据模型取决于两件事:你有多少技能,以及它的关系结构有多密集(密集=许多技能与其他技能相关)。如果关系结构很密集,而你的技能又很少(< 1000),你最好把整个事情表示成一个矩阵。
但是,如果你有很多技能,但是关系结构很稀疏,你可以用三个表来表示:
Skill {SkillId, SkillName}
RelevantSkill {SkillId, RelevantSkillId, RelevanceLevel}
IndirectRelevance { SkillId, RelevantSkillId, RelevanceLevel}
第三个表( IndirectRelevance )是基于两个主表计算的;每当您更改Skill或RelevantSkill表时,都需要更新IndirectRelevance表。
我认为有三个表比两个表更好;这使得实现更清晰、更直接。RelevantSkill包含显式声明的关系;IndirectRelevance所有派生事实。
https://stackoverflow.com/questions/702608
复制相似问题