2013-06-14 2 views
1

У меня есть таблица с именем, как OrganizationsБесконечное вложенное дерево организаций в базе данных

id | organization | parent_id 
-----+---------------+----------- 
51 | Organ1  | 0 
71 | Organ2  | 0 
83 | Organ2.1  | 71 
89 | Organ1.1  | 51 
104 | Organ1.1.1 | 89 
... 

Организацией, имеющая parent_id = 0 являются корневой организацией. Теперь я вижу, что я ошибаюсь. parent_id определяет родительскую организацию организации.

Сначала это выглядело блестящей идеей. Таким образом, я бы создал бесконечные вложенные дочерние организации в одной таблице.

Теперь я застрял, как определить, насколько глубока организация.

Моя текущая попытка сейчас, как следующее:

<?php 
$queryRootOrg = $db->prepare("SELECT * FROM Organizations WHERE parent_id = 0"); 

$queryRootOrg ->execute(); 
$menu = "<ul id='menu'>"; 

if($queryRootOrg ->rowCount() > 0) 
{ 
    while($rowRoot = $queryRootOrg ->fetch(PDO::FETCH_ASSOC)) 
    { 
     $menu .= "<li><a href='?org=".$rowRoot['id']."'>".$rowRoot['birim']."</a>"; 

     $queryChildren= $db->prepare("SELECT * FROM Organizations WHERE parent_id = :p1"); 
     $queryChildren->bindValue(":p1", $rowRoot['id'], PDO::PARAM_INT); 

      $queryChildren->execute(); 

     if ($queryChildren->rowCount() > 0) 
     { 
      $menu .= "<ul>"; 
      while($rowSub = $queryChildren->fetch(PDO::FETCH_ASSOC)) 
      { 
       $menu .= "<li><a href='?org=" . $rowSub['id'] . "'>" . $rowSub['birim'] . "</a></li>"; 
      } 
      $menu .= "</ul>"; 
     } 
     $menu .= "</li>"; 
    } 
} 

$menu .= "</ul>"; 
?> 

Этот код приносит мне только два уровня. Я думаю, что я не могу видеть организацию третьего уровня в списке. Вопрос: почему я знаю глубину организации в этом обстоятельстве? Или есть другой подход?

+0

Возможный дубликат [MySQL - Adjacency List Model - Get Depth] (http://stackoverflow.com/questions/10999888/mysql-adjacency-list-model-get-depth) –

+0

Рассматривали ли вы переход на вложенный набор модель? – Strawberry

+0

Так что в принципе .. если бы у вас была «глубина», ваши проблемы исчезли .. что-то подразумевает :) –

ответ

1

см ссылку ниже, как это обеспечить весь метод для маршрутизации через дерево, как структура,

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ 
+0

Это хорошая статья для разработки некоторых подходов. +1. – zkanoca

1

Вы можете использовать mysql nested set model (эта ссылка должна также ответить на все ваши родственные questinos)

Однако подход с родительским идентификатором, как и вы, является хорошим, поскольку он прост и прочен.

В некоторых случаях этого недостаточно.

В принципе нет другого способа, чем всегда выбирать родителя путем повторения и подсчета итераций.

Вы можете сделать это в php с отдельными запросами, а также с внутренними функциями (процедурами) mysql. Если вы находитесь в postgres, вы также можете делать рекурсивные запросы.

В вашем случае, если я думаю, что было бы лучше просто сохранить глубину вместе с родителем, просто имейте в виду, что вам нужно пересчитать ее, когда что-то изменится.

+0

Да, раньше. +1 – zkanoca

1

Вы можете попытаться просто прочитать все данные из MySQL и построить дерево с помощью PHP вручную, если ваша база данных невелика, это будет самый простой способ сделать.

+0

Я планировал, как вы говорите. (: +1 – zkanoca

Смежные вопросы