混淆为cms创建数据库设计

时间:2013-04-02 06:24:14

标签: php mysql database database-design

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


 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子菜单,那么我必须再创建更多的表, 但目前我的脑海里有能力思考这个数据库。

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

2 个答案:

答案 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

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

希望这有助于你