Index
有效地列出組和子組上的排序文章
假設我有一個系統,其中包含組和這些組上的文章。
一個組可以有多個“子組”
第 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
每個父組的列表,並使用它來檢索文章。但是,恐怕維護和確保它的準確性會很痛苦(比如使用 aTRIGGER
)。如果發生錯誤,然後我們必須修復索引,再次重建整個索引等等……有沒有更好的方法來做到這一點?
我希望使用更原生和自動維護的東西。
我使用 MariaDB 10.4 和 Sphinx 搜尋。
您要解決的是一種樹或層次結構問題。通常這些都可以通過遞歸來解決。特別是在像 MariaDB 這樣的 RDBMS 中,您可以使用稱為遞歸 CTE的東西來生成表示數據的父(祖先)/子樹狀結構的關係數據集。
就像過程語言中的遞歸一樣,在遞歸 CTE 中,有一個基本情況,即錨點和與錨點結合的遞歸情況。
通用語法範例:
WITH RECURSIVE ExampleRecursiveCTE AS ( -- Setting up the anchor / base case SELECT "" As ParentDescription, 0 AS ParentId, "This is the base case" AS ChildDescription, 0 AS ChildId UNION ALL -- The recursive levels SELECT ChildDescription AS ParentDescription, ChildId AS ParentId, -- The ancestor level becomes the parent of this level "Some cool stuff about this child" AS ChildDescription, ChildId + 1 AS ChildId -- This is the new child level FROM ExampleRecursiveCTE ) SELECT ParentDescription, ParentId, ChildDescription, ChildId FROM ExampleRecursiveCTE