dryas/f3_tree

PHP Fat-Free 框架 (F3) 的树辅助工具,实现修改后的前序树遍历算法

v1.0.0 2021-04-15 02:26 UTC

This package is auto-updated.

Last update: 2024-09-15 19:09:44 UTC


README

PHP Fat-Free 框架 (F3) 的树辅助工具,实现修改后的前序树遍历算法

Latest Stable Version Total Downloads License

什么是修改后的前序树遍历

修改后的前序树遍历 (MPTT) 是一种快速算法,用于在关系数据库中存储层次数据(如类别及其子类别)。这是我们大多数人都要处理的问题,我们使用了一个邻接表,其中表中的每个项目都包含一个指向其父项的指针,并且随着每个级别的增加,性能自然会下降,因为需要运行更多的查询来获取记录的子树。

修改后的前序树遍历算法的目标是使检索操作非常高效。使用它,您只需两个查询即可从数据库中获取任意子树。第一个查询用于获取子树根节点的详细信息,而第二个查询用于获取根节点的所有子节点和孙节点。

这种效率的代价是更新、删除和插入记录的成本更高,因为需要一些额外的工作来确保树结构始终保持良好状态。此外,由于算法特性,修改后的前序树遍历方法比邻接表方法更不直观。

有关修改后的前序树遍历方法的更多信息,请阅读这篇优秀的文章《数据库中存储层次数据》。

什么是 F3_Tree

F3_Tree 是 Fat-Free 框架的树辅助插件,为 Fat-Free 框架 提供修改后的前序树遍历算法的实现,使您能够轻松地在应用程序中实现 MPTT 算法。

它提供了在树中添加节点、删除节点、移动和复制节点以及在节点周围的方法,以及检索有关节点的各种信息的方法。

F3_Tree 基于 Zebra_Mptt 库,由 Stefan Gabos 开发,并使用 表锁 确保数据库完整性始终得到保护,并且并发 MySQL 会话不会损害数据完整性。此外,F3_Tree 使用缓存机制,结果是无论检索操作的类型或数量如何,数据库在每个脚本执行中只读一次!

与原始 Zebra_Mptt 库使用的 Mysqli 扩展不同,F3_Tree 库使用与 Fat-Free 框架中使用的相同的 PDO 扩展。

特性

  • 提供在树中添加节点、删除节点、移动和复制节点以及检索有关节点的各种信息的方法
  • 使用缓存机制,无论检索操作的类型或数量如何,数据库在每个脚本执行中只读一次!
  • 使用 表锁 确保数据库完整性始终得到保护,并且并发 MySQL 会话不会损害数据完整性
  • 代码注释详尽,当 PHP 的错误报告级别设置为 E_ALL 时不会生成警告/错误/通知

要求

PHP 5.0.0+、MySQL 4.1.22+、Fat-Free 框架 3.7.3+

注意:由于PDO提供了连接不同数据库系统的接口,因此该库也可能与MySQL(我主要使用的数据库)以外的其他数据库系统兼容。如果您想通过发送带有修改的拉取请求来使库与更多数据库系统兼容,我会非常高兴。谢谢!

安装

您可以通过Composer安装F3_Tree。

# get the latest stable release
composer require dryas/f3_tree

# get the latest commit
composer require dryas/f3_tree:dev-master

或者,您可以手动安装:下载最新版本,解压缩,然后将其包含到您的项目中。

require_once 'path/to/f3_tree.php';

安装MySQL表

注意一个名为install的目录,其中包含一个名为f3_tree.sql的文件。此文件包含用于创建由类存储数据的表的SQL代码。使用您首选的MySQL管理器(如phpMyAdmin)导入或执行SQL代码到您选择的数据库中。

如何使用

// If you don't use composers autoloader feature, you need to include the F3_Tree class
require 'path/to/f3_tree.php';

// Instantiate a new object of the class with an object of the Fat-Free Framework DB/SQL 
// class as the parameter:
$f3t = new F3_Tree($f3->get('DB'));

// populate the table

// add 'Food' as a topmost node
$food = $f3t->add(0, 'Food');

// 'Fruit' and 'Meat' are direct descendants of 'Food'
$fruit = $f3t->add($food, 'Fruit');
$meat = $f3t->add($food, 'Meat');

// 'Red' and 'Yellow' are direct descendants of 'Fruit'
$red = $f3t->add($fruit, 'Red');
$yellow = $f3t->add($fruit, 'Yellow');

// add a fruit of each color
$cherry = $f3t->add($red, 'Cherry');
$banana = $f3t->add($yellow, 'Banana');

// add two kinds of meat
$f3t->add($meat, 'Beef');
$f3t->add($meat, 'Pork');

// move 'Banana' to 'Meat'
$f3t->move($banana, $meat);

// get a flat array of descendants of 'Meat'
$f3t->get_children($meat);

// get a multidimensional array (a tree) of all the data in the database
$f3t->get_tree();

文档

您可以在F3_Tree的wiki中找到更多信息。

文档