sql >> Databáze >  >> RDS >> Mysql

PHP/MySQL - budování hierarchie navigačních nabídek

Hierarchická data jsou v relační databázi poněkud otravná (s výjimkou Oracle, který má operátory v START WITH/CONNECT BY se s tím vypořádat). V zásadě existují dva modely :seznam sousedství a vnořené množiny.

Vybrali jste si sady sousedství, což je to, co obvykle dělám také. Je mnohem snazší změnit než model vnořených množin, i když model vnořených množin lze načíst ve správném pořadí jediným dotazem. Seznamy sousedství nemohou být. Budete muset vytvořit přechodnou datovou strukturu (strom) a poté ji převést na seznam.

Co bych udělal (a nedávno jsem vlastně udělal):

  • vyberte celý obsah nabídky v jednom dotazu seřazeném podle nadřazeného ID;
  • Vytvořte strom struktury nabídky pomocí asociativních polí nebo tříd/objektů;
  • Procházejte stromem a vytvořte vnořené neuspořádané seznamy; a
  • Použijte plugin jQuery jako Superfish a přeměnit tento seznam na nabídku.

Vytvoříte něco takového:

$menu = array(
  array(
    'name' => 'Home',
    'url' => '/home',
  ),
  array(
    'name' => 'Account',
    'url' => '/account',
    'children' => array(
      'name' => 'Profile',
      'url' => '/account/profile',
    ),
  ),
  // etc
);

a převeďte jej na toto:

<ul class="menu">;
  <li><a href="/">Home</a></li>
  <li><a href="/account">Account Services</a>
    <ul>
      <li><a href="/account/profile">Profile</a></li>
...

PHP pro generování pole nabídek je poměrně jednoduché, ale řešení je trochu složité. Používáte rekurzivní funkci procházení stromu, která vytváří značku vnořeného seznamu HTML, ale její implementaci ponechá jako cvičení pro čtenáře. :)



  1. Struktura návrhu / normalizace databáze musí obsahovat AND, OR, volitelné prvky a jejich vztahy

  2. Jak spustit příkaz MySQL z hostitele do kontejneru se serverem MySQL?

  3. Je praktické dynamicky normalizovat tabulku?

  4. mysql - nějaký způsob, jak pomoci fulltextovému vyhledávání s jiným indexem?