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