我有一些巨大的数据库表格里充满了科学的名字,在父子关系中,像这样.
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它看上去很业余,但我惊讶地发现,“生活目录”显然使用了同样的方案,列数更多,行数超过100万行。
例如,通过这个方案,我可以通过简单地计算与Table.Family > Canidae匹配的物种的数量来计算子女和孙辈。我可以用一系列的“楼梯”查询来找出曾祖父母的名字等等。
因此,我想知道分层查询的好处是什么。它们更优雅,您可以只使用一两次查询就可以完成任何事情,而不是一系列的查询。我还假设它们更快,尽管我最初的查询(包含两个额外字段)已经足够快了。
层次查询是否有一些额外的显著优势,使我有理由聘请人来设置一个,或者这主要是一个速度问题?
发布于 2015-10-31 05:39:06
如果说分层查询,您指的是Postgresql 常用表表达式;答案是,它们是一个非常好的特性,它允许您编写更易读的查询,并且在某些情况下(但不是所有情况下)都会提高性能。
真的值得请人帮你安装postgresql吗?可能会,也可能不会。没有基准就很难说了。
你真正应该尝试的是:改进的预序树遍历现在听起来很复杂,但它不是
我们将从横向布置树开始。从根节点(“Food”)开始,在其左侧写一个1。跟着树到“果子”,然后在它旁边写一个2。通过这种方式,您可以沿着树的边缘行走(遍历),同时在每个节点的左侧和右侧写入一个数字。最后一个数字写在“Food”节点的右侧。在这个图像中,您可以看到整个编号树,以及几个箭头来表示编号顺序。
这是另一篇很好的文章。http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
这种方法可以在postgreql和mysql中使用,并且可以在不太困难的情况下转换现有的数据。
发布于 2015-10-31 07:22:44
递归/分层查询实际上通常要慢一些。这是不同的-有更多的行,但另一方面,每一行都要小得多。
主要的优点是灵活性,而不是性能。在您的表中有一组列..。但是,如果在最终父(根)和最终子(叶)之间有许多可能的步骤,该怎么办?或者是连接和打开的分支,这样一个对象就有两个父对象?这时,分层查询变得更有用。
https://stackoverflow.com/questions/33446883
复制相似问题