Php 如何为cms创建数据库设计

Php 如何为cms创建数据库设计,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我想创建一个动态菜单,以便管理员可以轻松地创建子菜单及其内容。 我不太擅长数据库设计。所以我想请你帮帮我 我的想法是: 数据库结构 1)Table: mainmenu --------------- mainmenu_id PK(primary key) menu_name ..... content longtext 2)Table: submenu ------------------- subm

我想创建一个动态菜单,以便管理员可以轻松地创建子菜单及其内容。 我不太擅长数据库设计。所以我想请你帮帮我


我的想法是:

数据库结构

 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 
但我认为这不是创建数据库的好方法,如果我有20或30个子菜单的第三子菜单表,那么我必须再次创建更多的表, 但目前我的大脑能够思考这个数据库


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

我认为您只需要一个依赖级别就可以做到这一点:父菜单

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

menuId (Int, PK)
parentMenuId (Int, FK)
menuTag (Char)
... (whatever you need)
当然,这种关系是与表本身的一对多关系:

menuId (1) --> parentMenuId(∞)
你可能已经意识到这是一个树状结构,那么,现在呢?你如何构建你的结构

从顶层开始:顶层菜单是没有父菜单uid的所有记录的集合。如果您决定顶级菜单具有
NULL
parentMenu,则:

select *
from tblMenu
where parentMenuId is null;
如果您决定顶级菜单具有定义的值(比如说
0
),只需使用以下where条件:
where parentMenuId=0

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

select *
from tblMenu
where parentMenuId = ? -- Your menuId goes here
这样,你就可以拥有你所需要的一切。当然,当前面的查询返回零行时,您已经完成了该菜单,可以继续下一步


希望这对您有所帮助

您只需要一个表,但您必须添加另一列,我们称之为
parent\u id
,以保留对其父表的引用

这样,具有
parent\u id
=0的元素将成为主菜单项。具有
parent\u id
>0的元素将是与
parent\u 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
示例
----------------
id |菜单|名称|内容|父项| id
----------------------------------------

1 | main 1 |这是主菜单1 | 0 IMHO这个问题更适合@pduersteler先生如果你知道的话,请帮助我创建第三个子菜单的多个子菜单,上表?你上面提到的这句话是我的答案吗<代码>6 |子菜单1-1 |这是子菜单1的第一个子菜单项1 | 3
@Ashutosh yes,id为=6的表格条目将是第三级菜单的第一项。为了清楚起见,我将更新示例。新的疑问!!因此,我应该将parentMenuId设置为数据库创建索引中的外键。或者我应该假设它在datbase表中没有索引和外键吗?哪一个更好?@Ashutosh为
parentMenuId
创建索引,因为您必须根据该列查询表。我的最后一个问题:我设置了索引,前端GUI也准备好了。几年后我会让我的博客出名。你想对我的数据库表提出任何其他建议吗?那么我应该将parentMenuId设置为数据库创建索引中的外键吗。或者我应该假设它没有在datbase表中生成索引和外键吗?我强烈建议您创建索引。。。但是外键是可选的,因为顶级菜单在
parentMenuId
字段中将有一个
null
(或
0
)值。正如您建议的,我创建了一个cms网站。但是现在,我很困惑如何使用这个数据库表制作站点地图(基于HTMLUL&li)。以上我已经用详细的方式更新了我的问题。请帮我解决这个新问题。(我的帐户目前不用于发布问题,即为什么我不能发布新问题)@Danny现在您的问题与数据库无关,而是与HTML(或其他web语言)有关。我承认:我对网页设计一无所知。我建议您重新标记您的问题或问另一个问题。谢谢您,先生,这与php循环有关。我正在尝试,您的评论表明您是一个善良的人。
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