我有一个系统来确定菜单链接层次结构并构建面包屑.我有2张桌子:Voce和Voci.
Voce是菜单链接名称和页面标题名称. Voci代表Voce的等级.每个Voce可以有另一个Voce作为儿子(在这里你没有看到相关代码,无论如何我使用JPA将Voce绑定到许多Voci).例如,这是页面/链接“添加多个项目”的层次结构:menu – >管理菜单 – >添加很多项目.
----------
| |
| \/ Voce
| -----------------------
| |id | name |
| -----------------------
| |1 |menu |
| -----------------------
| |2 |manage menu |
| -----------------------
| |3 |add single item |
| -----------------------
| |4 |add many items |
| -----------------------
|
|_____________
| |
| |
Voci | |
-----------------
|id |father|son |
----------------
|1 | 1 | 2 |
----------------
|2 | 2 | 3 |
-----------------
|3 | 2 | 4 |
-----------------
我的问题是:如何确定链接“添加多个项目”的层次结构以构建相对的面包屑?我必须从最后一个元素(“添加多个项目”)开始确定层次结构,这是我拥有的唯一数据.
是否有单个查询或JPA方式(我使用的是Spring MVC和Hibernate),它允许我知道确定链接“添加多个项目”层次结构的所有Voci记录.
我希望能够清楚.
谢谢
最佳答案 我建议使用闭包表模式.除了父ID和子ID之外,闭包表还包含深度列.对于每个深度,添加层次结构中的所有项目.
|parent|child|depth
|1 |1 |0
|1 |2 |1
|1 |3 |2
|1 |4 |3
|2 |2 |0
|2 |3 |1
|2 |4 |2
|3 |3 |0
|3 |4 |1
|4 |4 |0
您现在唯一要做的就是查询子项为所选菜单的所有条目,并按深度排序:
select parent from Voci where child = 4 order by depth
returns 4,3,2,1
-> select * from Voce where id in (select parent from Voci where child = 4 order by depth)
or a correspondent JPA Query
存在用于存储层次结构的其他几种模式.一些数据库支持(特定于供应商的)递归查询,但简单父ID的使用 – 和Voci基本上没有其他 – 被认为是反模式.