入れ子集合モデルを使用できます 非常に効率的なクエリが生成されるためです。 MySQLでの階層データの管理 を確認してください。 入れ子集合モデルというセクションを読んでください。 。
DoctrineのようなORMを使用している場合は、ネストされたセット機能を含む 。
左のネストされたセットの概念を理解するのは難しい場合があります と正しい。 XMLドキュメントのオープン/クローズタグの行番号のアナロジーとしてこれらの番号を使用すると、人々は理解しやすくなることがわかりました。
たとえば、上記のMySQLリンクのデータ例を見てください。
+-------------+----------------------+-----+-----+
| 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を取る場合 、 rgt フィールドをXMLドキュメントの行番号として使用すると、次のようになります。
1. <electronics>
2. <televisions>
3. <tube>
4. </tube>
5. <lcd>
6. </lcd>
7. <plasma>
8. </plasma>
9. </televisions>
10. <portable electronics>
11. <mp3 players>
12. <flash>
13. </flash>
14. </mp3 players>
15. <cd players>
16. </cd players>
17. <2 way radios>
18. </2 way radios>
19. </portable electronics>
20. </electronics>
このように表示すると、ネストされたセット階層の結果を視覚化するのがはるかに簡単になります。また、複数のクエリや結合を必要とせずにノード全体を選択できるため、このアプローチによって効率が向上する理由も明確になります。