分层查询的优点

时间:2015-10-31 00:48:13

标签: mysql postgresql recursive-query

我有一些巨大的数据库表,里面充满了科学名字,在父子关系中,就像这样......

TAXON | PARENT
Mammalia | Chordata
Carnivora | Mammalia
Canidae | Carnivora
Canis | Canidae
Canis-lupus | Canis

我安装了PostgreSQL并开始进行分层查询,但它比我想象的要复杂得多。所以我想坚持使用MySQL并回到原来的方案,看起来像这样:

TAXON | PARENT | FAMILY | ORDER
Mammalia | Chordata | (NULL) | (NULL)
Carnivora | Mammalia | (NULL) | Carnivora
Canidae | Carnivora | Canidae | Carnivora
Canis | Canidae | Canidae | Carnivora
Canis-lupus | Canis | Canidae | Carnivora

它看起来很业余,但我惊讶地发现生命目录显然使用相同的方案,有更多的列和超过一百万行。

通过这个方案,我可以通过简单地计算与Table匹配的物种数来统计子孙。家庭>例如,Canidae。我可以使用一系列" stairstep"查询以了解曾祖父母的姓名等。

所以我想知道分层查询的好处是什么。它们更优雅,你可以用一两个查询而不是一系列查询来做所有事情。我还假设他们的速度更快,但我的原始查询带有两个额外的字段,速度足够快。

分层查询是否具有一些额外的显着优势,可以证明我雇用某人设置一个,或者主要是速度问题?

2 个答案:

答案 0 :(得分:2)

递归/分层查询通常实际上较慢。它有所不同 - 还有更多行,但另一方面每行都要小得多。

主要优点是灵活性,而不是性能。在你的表中,你有一定数量的列......但是如果最终父(root)和终极子(leaf)之间有任何可能的步骤会怎么样?或者加入和打开的分支,以便一个对象有两个父母?这就是分层查询变得更有用的时候。

答案 1 :(得分:1)

如果通过分层查询,则表示Postgresql Common Table Expressions;答案是它们是一个很棒的功能,可以让你编写更多可读的查询,在一些(但不是全部)的情况下,可以提高性能。

是否真的值得聘请某人为您安装postgresql?也许,也许不是。没有基准就很难说。

你真正应该尝试的是:Modified Pre order Tree Traversal现在看起来很复杂,但它不是

  

我们首先要以横向方式布置树。从根节点('Food')开始,并在其左侧写一个1。按照树“果实”并在旁边写一个2。通过这种方式,您可以沿着树的边缘行走(遍历),同时在每个节点的左侧和右侧写入数字。最后一个数字写在'Food'节点的右侧。在此图像中,您可以看到整个编号的树,以及一些箭头来指示编号顺序。

这是另一篇关于它的优秀文章。 http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

这种方法可以在postgreql和mysql中使用,现有的数据可以毫不费力地转换。