我想创建一个动态菜单,以便管理员可以轻松创建子菜单及其内容。 我在数据库设计方面不太好。所以我想在这里问一下请帮帮我
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
但我认为这不是创建数据库的好方法,如果我有thirsubenu表的20或30子菜单,那么我必须再创建更多的表, 但目前我的脑海里有能力思考这个数据库。
如果您对此数据库有任何更好的设计,请分享。
答案 0 :(得分:4)
您只需要一个表,但是您必须添加另一个列,我们称之为parent_id
,以保持对其父级的引用。
这样,parent_id
= 0的元素将成为主菜单条目。 parent_id
>元素0将是与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
答案 1 :(得分:3)
我认为你可以只用一级依赖:父菜单。
让我们看看我能解释一下我的意思。假设您有下表:
menuId (Int, PK)
parentMenuId (Int, FK)
menuTag (Char)
... (whatever you need)
这种关系当然是与表本身的一对多关系:
menuId (1) --> parentMenuId(∞)
你现在可能已经意识到这是一个树状的结构,那么,现在呢?你如何建立你的结构?
从顶级开始:顶级菜单是没有parentMenuId
的所有记录的集合。如果您确定顶级菜单包含NULL
parentMenu,则:
select *
from tblMenu
where parentMenuId is null;
如果您确定顶级菜单具有已定义的值(例如0
),只需在条件为where parentMenuId = 0
的情况下使用。
现在,使递归魔法工作。对于集合中的每个menuId
:
select *
from tblMenu
where parentMenuId = ? -- Your menuId goes here
这样,您可以拥有所需的一切。当然,当前面的查询返回零行时,您已完成该菜单,并可以继续下一步。
希望这有助于你