php/Mysql 最佳树形结构
我必须构建一棵树,其中包含大约 300 个节点。该树没有深度限制。所以它可以有 3 或 15 个级别。每个节点可以有无限数量的子节点。
优先级是尽可能快地获得完整的树/子树,但有时我也需要添加节点或移动节点,但不是那么频繁。
我想知道在数据库中存储树的最佳方法以及在 php 中检索数据的最佳方法(如果可能的话)。
I have to build a tree that will contain about 300 nodes inside it. The tree has no depth limitations. So it can have 3 or 15 levels. Each node can have an unlimited number of children.
The priority is to get a complete tree / subtree the faster as possible, but I also need to add nodes or move nodes sometimes but not that often.
I want to know the best way to store the tree in the database and the best way to retrieve the data, if possible, in php.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用嵌套集模型,因为它可以产生非常有效的查询。查看管理 MySQL 中的分层数据并阅读名为 嵌套集模型。
如果您使用像 Doctrine 这样的 ORM,它 包括嵌套集功能。
对于某些人来说,理解“左”和“右”的嵌套集合概念可能很困难。我发现使用这些数字来类比打开/关闭标记的行号在 XML 文档中,人们发现它更容易掌握。
例如,采用上面 MySQL 链接中的数据示例:
如果您采用 lft、rgt 字段并将它们用作 XML 文档的行号,您将得到
:这种方式可以使某些人更容易地可视化生成的嵌套集层次结构。它还使人们更清楚为什么这种方法可以提高效率,因为它可以选择整个节点而无需多个查询或连接。
You can use a Nested Set Model as it yields very efficient queries. Check out Managing Hierarchical Data in MySQL and read the section called Nested Set Model.
If you're using an ORM like Doctrine, it includes nested set capabilities.
It can be difficult for some to grasp the nested set concepts of left and right. I have found that using those numbers as an analogy for the line numbers of open/close tags in an XML document, folks find it easier to grasp.
For instance, take the data example from the MySQL link above:
If you take the lft, rgt fields and use them as line numbers for an XML document, you get:
Seeing it this way can make it much easier for some to visualize the resulting nested set hierarchy. It also makes it clearer why this approach improves efficiency as it makes it possible to select entire nodes without the need for multiple queries or joins.
这是一篇很棒的文章:管理 MySQL 中的分层数据。我用了很长时间。
如果你有一定的数学能力,你就能真正理解为什么它如此伟大!
This is great article about it: Managing Hierarchical Data in MySQL. I used for a long time.
If you have some mathematical capabilities, you can really understand why it is so great!