有一些方法可以避免树层次结构查询中的递归(与人们在这里所说的相反)。
我用得最多的是Nested Sets。
然而,与所有生命和技术决策一样,需要做出权衡。嵌套集的更新速度通常较慢,但查询速度要快得多。有一些巧妙而复杂的方法可以提高更新层次结构的速度,但还有另一个权衡;性能与代码复杂性。
嵌套集的一个简单示例...
树视图:
-Electronics
|
|-Televisions
| |
| |-Tube
| |-LCD
| |-Plasma
|
|-Portable Electronics
|
|-MP3 Players
| |
| |-Flash
|
|-CD Players
|-2 Way Radios
嵌套集表示
+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
+-------------+----------------------+-----+-----+
您需要阅读我链接的文章以完全理解这一点,但我会尝试给出一个简短的解释。
如果(子项的“lft”(Left)值大于父项的“ltf”值)并且(子项的“rgt”值小于父项的“rgt”值),则一个项是另一个项的成员
“Flash”因此是“MP3 PLAYERS”、“Portable Electronics”和“Electronics”的成员
或者,conversley,“便携式电子产品”的成员是:
- MP3 播放器
- Flash
- CD 播放器
- 2 路收音机
Joe Celko 有一整本关于“SQL 中的树和层次结构”的书。有比你想象的更多的选择,但需要做出很多权衡。
注意:永远不要说不能做某事,一些mofo会出现在can中告诉你。