簡體   English   中英

混淆為cms創建數據庫設計

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM