为多级下拉菜单设计数据库

时间:2014-11-17 13:31:37

标签: php twitter-bootstrap database-design drop-down-menu

我知道如何使用HTML和CSS创建一个多级下拉菜单,这不是问题。但是,我需要一个简单的cms,最终用户很容易,完全没有技术技能,并且很容易为我创建网站。它也应该是轻量级的。

Concrete5是最终用户简易用户界面的一个很好的例子,直到它的最后版本。它现在太乱了。所以我无法找到一个,并开始创建自己的。

所以,我重新发明轮子(而且我已经完成了一半)来创建我自己的cms。但是,我遇到了一个我自己可以解决的问题,但我想确保一切都很快,并尽可能以最好的方式完成。


问题从这里开始。

如何设计我的数据库以允许下拉导航菜单?考虑到这些:

我的pages表看起来像这样:

pID |  pName  | pIsChildTo
 1     Front       0
 2     Page2       0
 3     SubTo2      2

正如你所看到的,我认为我可以列出当一个页面是另一个页面的子页面时,但是当我开始编写用于导航菜单创建的代码时,我意识到它并不是那样的简单。我不知道,当我在数据库中循环并创建一个子菜单时,我可以检查子页面(请注意我使用bootstrap进行导航)。

当然,如果我很懒,我可以在表格中添加一列,使其看起来像这样:

pID |  pName  | pIsChildTo | pHasChildren
 1     Front       0              0
 2     Page2       0              1
 3     SubTo2      2              0

在创建导航时循环浏览导航时,我只需检查pIsChildTo值,如果是1,就可以执行此操作。

foreach($db->fetchAll() as $r){
  if($r['pHasChildren'] != 0){ ?>
    <!-- insert dropdown logic here -->
  <?php }
  else{ ?>
    <li class=""><a href="?id=<?php echo $r['pID']; ?>"><?php echo $r['pName']; ?></a></li>
  <?php }
}

但这似乎是肮脏的方式。我应该改变一下我的数据库设计,如果是的话,我还需要做什么?

1 个答案:

答案 0 :(得分:0)

加长版:

你的数据库正确。但你可以解决你的需求,你需要知道一个声音是否有孩子? ok =)

假设您已获得此查询以获取所有菜单:

SELECT * FROM pages ORDER BY ....

你可以知道每个声音都是这样的:

SELECT p.*, (SELECT COUNT(*) FROM pages WHERE pIsChildTo =  p.pID) as children FROM pages p

编辑: 没有实际需要,最好不要更改正在运行的数据库。很多人使用大量数据作为菜单,你也可以使用短数据下拉菜单,但你需要确切知道你想要的东西=)

EDIT2:

SELECT p.*, //Select all pages field
(SELECT COUNT(*) FROM pages WHERE pIsChildTo =  p.pID) as children //This is a subquery
//i'm counting all the records that have the actual id on pIsChildTo field and putting the result
//into a field called children (you will find one for each row).
FROM pages p //p is a table alias.

如果我单独启动子查询,我将找到所有记录,其中示例2为“父”,即如果我们使用子查询,我们可以获得您所需要的东西。