这是以下内容的后续内容:
MySQL - 是否可以获取层次结构中的所有子项?
我有一个任意深度邻接表模型表(我现在的情况是can将其转换为嵌套集合模型.
我阅读了有关如何使用嵌套集合模型的 MySQL 数据,尽管执行插入、更新和删除等基本功能似乎变得越来越复杂且非常复杂。
另一个博客展示了如何使用带有邻接列表模型的触发系统来保存将每个对象与其祖先相关联的祖先表。
现在我需要能够返回给定节点的所有子节点的列表,以更改或删除它们。这种层次结构一旦创建就不会一直变化,但会产生大量的层次结构。
我看到的三种方法是:
创建了一个存储过程这将执行返回所有子项的递归查询。
转换为嵌套集模型这需要考虑复杂性,并可能创建一个存储过程来在其中添加、编辑和删除。
创建祖先表上面描述了插入/删除触发器来处理所有数据。
如果还有我没有探索的其他方法,请告诉我,我将更新此列表。
Quassnoi对嵌套集模型和邻接列表模型运行了一些性能测试,并在他的博客文章中记录了结果和建议邻接表与嵌套集:MySQL。执行摘要是:
- 嵌套集可以更快地获取所有子节点或所有父节点。
- 如果您经常需要更新表,则嵌套集不是一个好主意。
这是他文章的结论:
在 MySQL 中,如果层次结构的更新不频繁,并且在更新期间锁定表(在长表上可能需要几分钟)是可以承受的,则应首选嵌套集模型。
这意味着使用 MyISAM 存储引擎创建表,创建如上所述的 GEOMETRY 类型的边界框,使用 SPATIAL 索引对其进行索引,并将级别保留在表中。
如果表的更新频繁,或者更新所带来的长时间锁定表的负担无法承受,那么应该使用邻接表模型来存储分层数据。
这需要创建一个函数来查询表。
本文的其余部分将展示如何定义表、实现查询并提供性能测量。使用空间索引是一个聪明的想法,可以提高您可能不熟悉的嵌套集模型的性能。
如果您也在考虑不使用 MySQL 的方法,那么您可能需要看看PostgreSQL这是另一个免费的开源数据库。 PostgreSQL 支持以下形式的递归查询递归公用表表达式这使得查询分层数据比在 MySQL 中更容易,并且性能也更好。 Quassinoid 也写过一篇文章邻接表与嵌套集:PostgreSQL显示详细信息。
当我们谈论其他方法时,Oracle 的数据库也值得一提。 Oracle也有一个自定义扩展CONNECT BY
这使得查询分层数据变得非常容易和快速。苦木素文章邻接表与嵌套集:Oracle再次涵盖性能细节。在这种情况下,获取所有子项所需的查询非常简单:
SELECT *
FROM yourtable
START WITH id = 42
CONNECT BY parent = PRIOR id
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)