Разработка базы данных для многоуровневого выпадающего меню

Я знаю, как создать многоуровневое выпадающее меню с HTML и CSS, это не проблема. Тем не менее, мне нужна простая CMS, простая для конечного пользователя без каких-либо технических навыков и достаточно простая для создания сайтов для меня. Он также должен быть легким.

Concrete5 был хорошим примером простого пользовательского интерфейса для конечного пользователя до последней версии. Это слишком загромождено сейчас. Так что я не смог найти ни одного и начал создавать свой.

Итак, я заново изобретаю колесо (и я в значительной степени на полпути), чтобы создать свой собственный cms. Тем не менее, я сталкиваюсь с проблемой, которую могу решить самостоятельно, но хочу убедиться, что все быстро и сделано наилучшим образом.


Вопрос начинается здесь.

Как мне спроектировать базу данных, чтобы разрешить выпадающие меню навигации? Учитывая эти вещи:

мой pages Таблица выглядит так упрощенно:

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

Итак, как вы можете видеть, я подумал, что мог бы просто перечислить, когда страница является подстраницей для другой страницы, но когда я начал писать код для создания меню навигации, я понял, что это не так просто. Я не знаю, каким образом я мог бы проверять наличие дочерних страниц при циклическом просмотре базы данных и создавать подменю (обратите внимание, что я использую загрузчик для навигации).

Конечно, если бы мне было лень, я мог бы добавить столбец к моей таблице, чтобы он выглядел так:

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 }
}

Но это кажется грязным путем. Должен ли я немного изменить свой дизайн базы данных, и если да, что мне нужно сделать?

0

Решение

Расширенная версия:

Вы правы на своем БД. Но вы можете обойти свои потребности, вам нужно знать, есть ли голос у детей? хорошо =)

Допустим, у вас есть этот запрос, чтобы получить все ваше меню:

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 имеют «родительский», при этом, если мы используем это подзапрос, мы можем получить что-то, что вам нужно.

0

Другие решения

Других решений пока нет …