现在有一个问题,我们通常使用这种技术来维护父子关系,即我们将所有实体存储在一个表中,其中parent_id列为parent_id列,所有最顶级父母都有这是一个很好的和规范化技术我同意,但也有一个缺点,它是缓慢和低效率。这主要是由于像每个家长,我们必须再次运行查询,并再次作出树通过第n个孩子ID获得最顶级的父母?
SELECT id FROM `table` WHERE parent_id=something
我已经看过了解决方案,通过运行查询的一些可能会尝试与任何编程语言做递归一次又一次地在服务器上产生负载,一些提供了存储过程,但也涉及递归。
所以我的问题是我们可以用一个数据库查询树(连接或子查询)吗?
- 如果我们知道深度还是我们不知道深度?
- 如果有可能,我们如何获得任何孩子的最顶级父母(即parent_id = 0)?
如果这是不可能的,那么为什么这种技术是如此着名,虽然它有缺陷,或者我们有另一种解决方案呢?
我已经加入了SQL小提琴,但它只有架构
不像一些其他的RDBMS,MySQL不支持递归函数等是不适合这是存储分层数据的“邻接表”模型。您应该考虑重新构建您的模式以将分层结构嵌入到MySQL可以利用的表单中,例如“嵌套集合”或“传递闭包”。 – eggyal
@eggyal但现在很多cms都遵循这种技术,像最常用的wordpress也提供了第n个菜单级别,页面级别和类别级别,所以我的问题是有没有更好的方式来存储和获取树,而无需运行多个查询? –
您可以为您希望获取的每一代自行加入,但深度总是受限于查询中的连接数。 – eggyal