在多对多 SQL 表中查找数据关系或图形
Posted
技术标签:
【中文标题】在多对多 SQL 表中查找数据关系或图形【英文标题】:Finding data relations or graphs in many-to-many SQL tables 【发布时间】:2012-04-26 04:37:36 【问题描述】:我的工作中有几种类型的多对多表。我有将单词与其他单词(ngram)相关联的应用程序,以及可以将用户与其他用户(朋友/关注者)相关联的数据库。
我想知道如何与这些数据建立关系,以便为我的应用推荐和我的用户找到有用的联系。
使用以下简单的数据库表,其中包含将一个节点链接到另一个节点的外键。
id | node1 | node2
--------------------
1 | 1 | 2
2 | 1 | 3
3 | 1 | 4
4 | 2 | 1
5 | 2 | 3
6 | 2 | 5
7 | 3 | 1
例如,在上面的表格中,很明显“1”是最受欢迎的,因为它的链接最多(2 和 3)。很明显,也许“2”应该与“4”相关联,因为“2”与“1”有很多关系(而“1”与“4”相关联)。
所以,例如我可以找到:
将节点连接到其他节点的路径。 基于相似性的有益联系(推荐) 共享相关连接的节点组其他常见的关系形式有 user <=> friends
或 blog_post <=> tags
。
我正在寻找可以由前端直接运行的 SQL 查询,或者可以每晚运行以从这些数据中提取关系的 map-reduce 作业。
【问题讨论】:
你的关系图已经建立——你的节点形成了一种重复的邻接列表(即边列表)。您可以使用 BFS 等算法找到从一个节点到另一个节点的路径。使用普通 SQL 和GROUP BY
操作很容易找到节点组。而要搜索相似之处/推荐,您需要一个特定的算法(例如collaborative filtering)。无论如何,您已经有了关系,所以请完善您的问题以说明您的实际目的。
什么是 ID?代理键?元组是否意味着:“node2 喜欢 node1”?
正如 wildplasser 所说,您需要弄清楚您的算法,然后编写 Sql。我会将问题更改为“首选推荐算法是什么”
【参考方案1】:
Powergagets可以使用SQL数据制作图表。
【讨论】:
我不是指“视觉”图表。【参考方案2】:正如 ffriend 指出的那样,您的数据结构非常适合您尝试做的事情。这更像是一个前端问题,例如,您将如何呈现信息?
需要研究的是一些节点遍历技术,以确定节点之间的跳数(相关性)、连接到单个节点的节点数(广度)、有意义的路径可以走多少跳(深度)。我会考虑的唯一另一件事是用于帮助确定相关性。这或多或少是在使用期间节点路径已经经过多少次的计数器。这是您可以开始为特定路径分配权重的地方。例如,如果从 1 到 5 (1 -> 2 -> 5) 的路径作为第一次遍历,它可能看起来像这样......
id | node1 | node2 | count
------------------------------
1 | 1 | 2 | 1
2 | 1 | 3 | 0
3 | 1 | 4 | 0
4 | 2 | 1 | 0
5 | 2 | 3 | 0
6 | 2 | 5 | 1
7 | 3 | 1 | 0
这种方法可以通过使用计数器作为权重因子来帮助识别节点之间的意义关系。
请记住,使用这种数据结构,您将需要一个方法去每个方向(1 -> 5 和 5 -> 1)
【讨论】:
【参考方案3】:根据我对图的记忆,Dijkstra-Prinn 和 Kruskal 的算法在这里可能对您有用。它们都是搜索算法(我不记得它们是 BFS 还是 DFS……已经有一段时间了:p),可以帮助您获取整个图并找到最佳遍历路径。
他们不会为您提供 SQL 查询,但他们会提供一个数学“跳板”来帮助您为您的 SQL 查询找到正确的逻辑。
正如水上乐园所说的他的计数器系统,您可以利用上述程序获取一个起点,然后使用计数器系统进行双重检查。
另外,正如 ffriend 之前所说,我不确定您是出于优化目的还是出于其他用途收集这些数据,所以我认为如果您重新构建您的问题,您可能会得到更好的帮助。
祝你好运。
【讨论】:
【参考方案4】:也许寻找 NOSQL 数据库是解决问题的更好方法。更具体地说,首先使用一些图数据库(如 neo4j)来表示您的 sql 数据,而不是简单地遍历图以查找您想要的关系和组。
在您的用例中,使用图形数据库总是更好,因为性能比在表上使用带有多个连接的 sql 时快几倍。
【讨论】:
以上是关于在多对多 SQL 表中查找数据关系或图形的主要内容,如果未能解决你的问题,请参考以下文章