[英]confused to create a database design for cms
我想創建一個動態菜單,以便管理員可以輕松創建子菜單及其內容。 我在數據庫設計方面不太好。 所以我想在這里問一下請幫助我
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子菜單,那么我必須再創建更多的表,但目前我的腦海里能夠思考這個數據庫。
如果您對此數據庫有任何更好的設計,請分享。
您只需要一個表,但是您必須添加另一個列,我們稱之為parent_id
,以保持對其父級的引用。
這樣, parent_id
= 0的元素parent_id
為主菜單條目。 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
我認為你可以只用一級依賴:父菜單。
讓我們看看我能否解釋我的意思。 假設你有下表:
menuId (Int, PK)
parentMenuId (Int, FK)
menuTag (Char)
... (whatever you need)
當然,這種關系是與表本身的一對多關系:
menuId (1) --> parentMenuId(∞)
你現在可能已經意識到這是一個樹狀的結構,那么,現在呢? 您如何建立自己的結構?
從頂級開始:頂級菜單是沒有parentMenuId
的所有記錄的parentMenuId
。 如果您確定頂級菜單具有NULL
parentMenu,則:
select *
from tblMenu
where parentMenuId is null;
如果您確定頂級菜單具有已定義的值(假設為0
),則只需使用where where condition: where parentMenuId = 0
。
現在,使遞歸魔法工作。 對於您的集合中的每個menuId
:
select *
from tblMenu
where parentMenuId = ? -- Your menuId goes here
這樣,您可以擁有所需的一切。 當然,當前面的查詢返回零行時,您已完成該菜單,並可以繼續下一個。
希望這對你有所幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.