mysql - 我如何构造在 MySQL 数据库中链接在一起的一堆项目?

标签 mysql sql database database-design recursion

对于我的问题标题含糊不清,我深表歉意,但我什至不知道如何称呼我想要完成的事情。

描述我想要的东西的最佳方式是我希望能够将一堆项目链接在一起,然后(可能)递归地找到属于包含目标项目的任何链的一部分的所有项目。例如,注意以下链中的 item3:

item1 => item2 => item3 => item4
item5 => item3 => item6  
item3 => item7 => item8  
item3 => item9 => item10  
item11 => item12 => item13 => item3

如果用户要搜索 item3,那么我希望显示上面的所有五个链。换句话说,我希望能够找到 item3 的所有后代和祖先,以便我可以在 HTML 表格(或任何最适合的 HTML 结构)中显示数据。
使这变得棘手的是(如上所示)任何给定的项目都可能有许多后代和许多祖先。因此,我不确定 MySQL 中的常规递归是否可行。
我确实查看了以下 SO 线程的最佳答案中链接的两篇文章,但我认为建议的解决方案不适用于我所需的数据结构:
Mysql recursion?

有没有什么方法可以将这种数据构建到 MySQL 数据库中,以便通过相当简单和轻量级的查询(即,希望每个项目请求一个查询),我可以获得我正在寻找的信息和结构?< br/> 非常感谢。

最佳答案

我有一个建议。

在以下结构中存储项目。

+---------+-----------+
|   id    |    item   |
+---------+-----------+
|   1     |   item3   |
+---------+-----------+

并在下面添加链接引用

+---------+-----------+------------+
|  itemid |  ancestor | descendant |
+---------+-----------+------------+
|  1      |  3        | 2          |
+---------+-----------+------------+
|  1      |  5        | 7          |
+---------+-----------+------------+

在所有三列上创建索引。这将使您能够添加与出现在链上的相同时间一样多的时间。 您还可以查询特定项目以查找其所有相关链接。

关于mysql - 我如何构造在 MySQL 数据库中链接在一起的一堆项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15048325/

相关文章:

mysql - 选择具有多个参数的 HAVING

php - 从 PHP 连接到 Informix 标准引擎 (SE)

Php、MySql、具有两个计数的单个查询

mysql - 根据名称列更新别名列

sql - 数据库设计-如何在同一个表中拥有主键的外键?

java.sql.SQLException : No suitable driver found for jdbc:mysql://localhost:3306/dbname

mysql - 通过外键外部引用使用过滤器汇总子查询注释

mySQL 5.0.45 LAST_INSERT_ID() 和大于 signed int 的值

php - 如何使用 php 更新 sql 中的图像

带日期的 Mysql 查询优化