現在有一個問題,我們通常使用這種技術來維護父子關係,即我們將所有實體存儲在一個表中,其中parent_id列爲parent_id列,所有最頂級父母都有這是一個很好的和規範化技術我同意,但也有一個缺點,它是緩慢和低效率。這主要是由於像每個家長,我們必須再次運行查詢,並再次作出樹通過第n個孩子ID獲得最頂級的父母?
SELECT id FROM `table` WHERE parent_id=something
我已經看過了解決方案,通過運行查詢的一些可能會嘗試與任何編程語言做遞歸一次又一次地在服務器上產生負載,一些提供了存儲過程,但也涉及遞歸。
所以我的問題是我們可以用一個數據庫查詢樹(連接或子查詢)嗎?
- 如果我們知道深度還是我們不知道深度?
- 如果有可能,我們如何獲得任何孩子的最頂級父母(即parent_id = 0)?
如果這是不可能的,那麼爲什麼這種技術是如此着名,雖然它有缺陷,或者我們有另一種解決方案呢?
我已經加入了SQL小提琴,但它只有架構
不像一些其他的RDBMS,MySQL不支持遞歸函數等是不適合這是存儲分層數據的「鄰接表」模型。您應該考慮重新構建您的模式以將分層結構嵌入到MySQL可以利用的表單中,例如「嵌套集合」或「傳遞閉包」。 – eggyal
@eggyal但現在很多cms都遵循這種技術,像最常用的wordpress也提供了第n個菜單級別,頁面級別和類別級別,所以我的問題是有沒有更好的方式來存儲和獲取樹,而無需運行多個查詢? –
您可以爲您希望獲取的每一代自行加入,但深度總是受限於查詢中的連接數。 – eggyal