2

我想创建一个动态菜单,以便管理员可以轻松地在其上创建子菜单及其内容。我在数据库设计方面不太好。所以我想在这里问请帮助我


 eg. Java-main menu
     Core Java- sub menu
     Frameworks - Sub menu
        -Struts 1  (Sub menu of 2nd submenu)
        -Struts 2  (Sub menu of 2nd submenu)

 ---------------

我从脑海中尝试过的是:

数据库结构

 1)Table: mainmenu
    ---------------
     mainmenu_id   PK(primary key)
     menu_name     ..... 
      content      longtext

    2)Table: submenu
    -------------------
     submenu_id     PK
     mainmenu_id    FK (foreign key refrences mainmenu table)
     submenu_name   ..... 
    content         longtext


    3)Table: thirdsubmenu
    --------------------
      thirdsubmenu_id     PK
      submenu_id          FK (foreign key refrences submenu table)
      thirdsubmenu_name     ........
      content             longtext 

但我认为这不是创建数据库的好方法,如果我有 20 或 30 个 thirsubenu 表的子菜单,那么我必须再次创建更多表,但目前我的头脑能够思考这个数据库。

如果您对此数据库有更好的设计,请分享。

4

2 回答 2

4

您只需要一个表,但您必须添加另一列,我们称之为它parent_id,以保持其父级的引用。

这样,parent_id= 0 的元素将成为主菜单条目。> 0的元素parent_id将是与 相关的子菜单条目parent_id

像这样的东西:

 Table: menu
---------------
 id   PK(primary key)
 menu_name     ..... 
 content      longtext
 parent_id    int(key to id)

这是存储在表中的数据的示例:

Example
----------------
id | menu_name | content | parent_id
----------------------------------------
1  | main 1    | this is main menu 1 | 0                           <-- First level menu
2  | main 2    | this is main menu 2 | 0                           <-- First level menu  
3  | submenu 1 | this is main menu 1's first submenu's item 1 | 1  <-- Second level menu
4  | submenu 1 | this is main menu 1's first submenu's item 2 | 1  <-- Second level menu
5  | submenu 2 | this is main menu 2's first submenu's item 1 | 2  <-- Second level menu
6  | submenu 1-1 | this is submenu 1's first submenu's item 1 | 3  <-- Third level menu
7  | submenu 1-2 | this is submenu 1's first submenu's item 2 | 3  <-- Third level menu
于 2013-04-02T06:38:45.223 回答
3

我认为你可以只用一层依赖来做到这一点:父菜单。

让我们看看我能不能解释我的意思。假设您有下表:

menuId (Int, PK)
parentMenuId (Int, FK)
menuTag (Char)
... (whatever you need)

当然,这种关系是与表本身的一对多关系:

menuId (1) --> parentMenuId(∞)

您现在可能已经意识到这是一个树状结构,那么,现在呢?你如何构建你的结构?

从顶层开始:顶层菜单是所有没有parentMenuId. 如果您决定顶级菜单具有NULLparentMenu,则:

select *
from tblMenu
where parentMenuId is null;

如果您决定顶级菜单具有定义的值(比如说0),只需使用这个 where 条件:where parentMenuId = 0

现在,让递归魔法发挥作用。对于menuId您的集合中的每个:

select *
from tblMenu
where parentMenuId = ? -- Your menuId goes here

这样,您就可以拥有所需的一切。当然,当前面的查询返回零行时,您已经完成了该菜单,可以继续下一个。

希望这可以帮助你

于 2013-04-02T06:37:22.527 回答