【问题标题】:confused to create a database design for cms为 cms 创建数据库设计感到困惑
【发布时间】:2013-04-02 06:24:13
【问题描述】:

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


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

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

【问题讨论】:

标签: php mysql database database-design


【解决方案1】:

您只需要一个表,但您必须添加另一列,我们称之为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

【讨论】:

  • 第三个子菜单的子菜单可以用上表创建很多吗?您上面提到的这条线是否解释了我的回答? 6 | submenu 1-1 | this is submenu 1's first submenu's item 1 | 3
  • @Ashutosh 是的,id = 6 的表条目将是第三级菜单的第一项。为了清楚起见,我将更新示例。
  • 新的疑问!!所以我应该将 parentMenuId 设置为我的数据库创建索引的外键。或者我应该假设它没有在数据库表中创建索引和外键?哪个会更好?
  • @Ashutosh 为parentMenuId 创建索引,因为您必须针对该列查询表。
  • 我的最后一个问题:我设置了索引,前端 GUI 也准备好了。几年后我会让我的博客出名。你想就我的数据库表提供任何其他建议吗?
【解决方案2】:

我认为您可以只使用一个依赖级别:父菜单。

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

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 条件:where parentMenuId = 0

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

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

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

希望对你有帮助

【讨论】:

  • 所以我应该将 parentMenuId 设置为我的数据库创建索引的外键。或者我应该假设它没有在数据库表中创建索引和外键?
  • 我强烈建议您创建索引...但外键是可选的,因为顶级菜单将在 parentMenuId 字段中具有 null(或 0)值
  • 按照您对这个数据库的建议,我创建了一个 cms 网站。但现在我很困惑使用这个数据库表制作站点地图(基于 HTML Ul & li)。上面我已经通过详细的写作方式更新了我的问题。请帮我解决这个新问题。 (我的帐户目前无法发布问题,即为什么我不能发布新问题)
  • @Danny 现在您的问题与数据库无关,而是与 HTML(或其他一些网络语言)有关。我承认:我对网页设计一无所知。我建议您重新标记您的问题或提出其他问题。
  • 谢谢先生,它与php循环有关。我正在尝试,您的cmets表明您是一个好人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多