如何在数据库中查找值之间的关系

时间:2014-08-06 10:03:08

标签: mysql sql database graph

这对我来说有点难以解释,但我会尽力向你们解释。我为关系数据库设计了一个搜索引擎。我希望它独立于数据库的结构,即它可以在任何提供的数据库上运行。我希望当用户插入一个字符串,例如两个名称'abc xyz'时,它会显示包含两个名称'abc xyz'的所有行,如果没有这样的行,那么它应该显示名为'abc'的行和名为'xyz'的行,并显示两者之间的关系。例如,'abc'是'mno'的朋友,而'mno'又是'jkf'的朋友,'jkf'又是'xyz'的朋友。所以我也希望展示这种关系。这只是我希望我的应用程序做的事情的一个例子。我想让它搜索所有这些关系,如果它们存在并显示它们。我知道这个例子与应用程序的复杂性相比有点模糊,但任何想法都值得赞赏。

注意: 我知道neo4j和orientdb Dbms使用图形数据库,但我不想使用它们。我相信需要一种寻找这种关系的图形方法。但是我想问一下这样的任务是否只能用sql来完成。我使用mysql作为我的数据库。请帮助我解决任何适用于我的平台的查询或存储过程。从我学到的information_schema可以派上用场,但我不知道如何使用它为此目的。如果还有其他语言可以完成这项工作,我也想听听他们的意见。

从我的角度来看。从A点到B点的数据库遍历(A点和B点是用户给出的字符串中的单词)也可以帮助我。所有意见都受到欢迎。

1 个答案:

答案 0 :(得分:1)

我不确定我是否帮助你,但我希望无论如何这对你有所帮助。 如果你想在几个点上搜索两行之间的关系,它基本上是一个图搜索问题,另请参阅Wikipedia | Graph theory。解释一点......
您可以将每一行之间的关系可视化为图形,例如彼此了解的人:

A--B
\  /  
 C

现在是一个更复杂的例子:

A--B--D
\  / / 
 C--E--F

在这种情况下,A例如通过C知道E但是A通过B和D知道E. B也通过D和E或通过C和E知道F

这适用于存储在同一个表中的所有记录以及任何其他表中的记录。例如,要访问与同一表中的搜索记录直接相关的所有节点,请使用:

SELECT * FROM TABLE WHERE referenced_rec = 
    (SELECT rec FROM TABLE WHERE value = "abc")
     AND value = "xyz"

要访问存储在与此表直接相关的表中的所有记录:

select * from (
    select TABLE_NAME
    from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where
    REFERENCED_TABLE_NAME = 'your_current_table')
where your_current_table.value = "abc" 
      AND (select REFERENCED_COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME = 'your_current_table') = (select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME = 'your_current_table')
      AND (select COLUMN_NAME from INFORMATION_SCHEMA.KEY_COLUMN_USAGE where REFERENCED_TABLE_NAME = 'your_current_table') = "xyz"

我很确定这不起作用,但是现在我没有机会进行测试。然而,获得这些SQL是正确的另一个主题,您可以查看这个Stack Overflow Question

只要您能够从此表或任何相关表中获取所有记录,您就可以将其映射到图表,如上所示。 您无法单独使用SQL解决此问题,因为您不知道解决它需要多少步骤。您可以使用任何最短路算法,例如Wikipedia | Djikstra。我想你可以通过简短的搜索找到有关如何实现这一点的信息。

我希望这对你有所帮助; - )

最诚挚的问候 斯维尔