【问题标题】:Is there a way of implementing tree ADT in php and mysql?有没有办法在 php 和 mysql 中实现树 ADT?
【发布时间】:2011-11-19 00:25:38
【问题描述】:

有没有办法在 PHP 和 Mysql 中使用树形数据结构存储和工作(添加、删除等)?

PHP 的 RecursiveItrator 迭代器在这里有用吗?

所以基本上我想要树状结构,存储一些层次结构,比如一些可以无限期使用的产品的类别,能够将所有内容存储在数据库中,获取它们并做一些简单的事情,比如 BFS 和 DSF遍历它们。

【问题讨论】:

  • 类似但不重复,里面的表结构很弱,这种存储方式,在一本叫anti patterns的书里被称为naive方式。这也是我寻找更好方法的部分原因,我不只是在寻找解析和存储它,而是寻找一种简单的使用方式,允许 BFS 和 DSF 以及其他树迭代技术
  • 那本书的作者是个天才。听他的。

标签: php mysql data-structures tree hierarchical-data


【解决方案1】:

当您使用邻接列表时,获取给定树的所有节点的一个好方法是在每一行添加一个名为 root_id 或其他名称的列,这样每个节点不仅知道它的直接父节点,还知道顶部节点在它的树上。

CREATE TABLE Comments (
  comment_id INT PRIMARY KEY,
  root_id INT,
  parent_id INT,
  FOREIGN KEY (root_id) REFERENCES Comments (comment_id),
  FOREIGN KEY (parent_id) REFERENCES Comments (comment_id)
);

因此,如果您的层次结构为 10 -> 20 -> 30,您将存储以下内容:

INSERT INTO Comments SET comment_id = 10, root_id = 10;
INSERT INTO Comments SET comment_id = 20, root_id = 10, parent_id = 10; 
INSERT INTO Comments SET comment_id = 30, root_id = 10, parent_id = 20; 

这类似于 Slashdot 存储 cmets 树的方式。

如果您可以编写一个查询来获取给定树的所有节点,并且每个节点都知道其直接父节点,那么按照存储分层数据的邻接表设计风格,您可以将查询结果集转换为多维获取对象时的数组或对象树。

请参阅我对Convert flat array to the multi-dimentional 的回答,了解在 PHP 中执行此操作的代码。

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2011-09-01
    • 2012-12-18
    相关资源
    最近更新 更多