ツリー階層クエリで再帰を回避する方法があります (人々がここで言ったことに反して)。
私が最もよく使ったのは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" (左) 値が親の "ltf" 値より大きい) AND (子の "rgt" 値が親の "rgt" 値より小さい) 場合、項目は別の項目のメンバーです。
したがって、「Flash」は「MP3 PLAYERS」、「Portable Electronics」および「Electronics」のメンバーです。
または、conversley、「ポータブル エレクトロニクス」のメンバーは次のとおりです。
- MP3 プレーヤー
- フラッシュ
- CD プレーヤー
- 2 ウェイ ラジオ
Joe Celko は、"Trees and Hierarchies in SQL" に関する本全体を持っています。考えているよりも多くのオプションがありますが、多くのトレードオフを行う必要があります。
注: 何かができないとは決して言わないでください。一部の mofo が現れて、できることを示します。