假设我有一个系统,其中包含组和这些组上的帖子。
一个组可以有多个“子组”
第 1 组 > 第 2 组 > 第 3
组 第 1 组 > 第 2 组 > 第 4
组 第 1 组 > 第 5 组 > 第 6 组
...
所以我有这两张表:
Groups (*GroupId*, Name, ParentGroupId, ...)
Posts (*PostId*, GroupId, UserId, Text, ...)
显示第 3、4 和 6 组的最新 10 个帖子的列表不是问题。一个关于它
的索引( )。GroupId
WHERE GroupId=12345 ORDER BY PostId DESC
但是,我面临的挑战是如何使第 2 组列表帖子直接在第 2 组中创建,而且还针对儿童(第 3 组和第 4 组),以及第 1 组(第 1 组和所有儿童的列表帖子) ,排序)。
我唯一能想到的就是创建一个额外的“索引表”,其中包含PostId
每个父组的列表,并使用它来检索帖子。但是,恐怕维护和确保它的准确性会很痛苦(比如使用 a TRIGGER
)。如果发生错误,然后我们必须修复索引,再次重建整个索引等等......
有没有更好的方法来做到这一点?
我希望使用更原生和自动维护的东西。
我使用 MariaDB 10.4 和 Sphinx 搜索。
您要解决的是一种树或层次结构问题。通常这些都可以通过递归来解决。特别是在像 MariaDB 这样的 RDBMS 中,您可以使用称为递归 CTE的东西来生成表示数据的父(祖先)/子树状结构的关系数据集。
就像过程语言中的递归一样,在递归 CTE 中,有一个基本情况,即锚点和与锚点结合的递归情况。
通用语法示例: