2015-06-08 2 views
3

Я пытаюсь сохранить иерархические данные с помощью SQLite. После многого поиска я решил использовать nested set model вместо adjacency list, так как почти 90% операций будут считаться, и только 10% будут обновляться/удаляются/создаются.Использование модели вложенного набора для хранения Иерархических данных в sqlite Как переместить категорию в другую категорию

Я последовал этому примеру: http://www.phpro.org/tutorials/Managing-Hierarchical-Data-with-PHP-and-MySQL.html

И это прекрасно работает, чтобы добавлять, удалять и читать новые узлы.

Но я не нашел статьи, объясняющей, как обновить дерево, например. перемещение категории в другую категорию.

Ниже моя структура базы данных:

id name left_node right_node 
1 name1  1   2 

** я не нашел место, объясняющее, как обновить иерархию, которая мне нужна. **

Другая проблема заключается в

public function delete_node($pleft, $pright){ 

$width = $pright-$pleft+1; 

$delete_sql = "delete from categories where left_node between $pleft and $pright"; 
$update_sql1 = "update categories set right_node = right_node-$width where right_node > $pright"; 
$update_sql2 = "update categories set left_node = left_node-$width where left_node> $pright"; 
// 
$this->db->trans_start(); 
// 
$this->db->query($delete_sql); 

// 
$this->db->query($update_sql1); 
$this->db->query($update_sql2); 
$this->db->trans_complete(); 
// 
return $this->db->trans_status(); 
} 

Это мой метод удаления, и это занимает 30мс до конца. Это нормально?

Я решил проблему, спасибо за помощь http://www.ninthavenue.com.au/how-to-move-a-node-in-nested-sets-with-sql

Я использую CodeIgniter с SQLite базы данных. ниже моя функция,

public function move_node($pleft, $pright, $origin_left_pos, $origin_right_pos){ 

// 
//the new_left_position is different according to which way you want to move the node 
$new_left_position = $pleft + 1; 
// 
$width = $origin_right_pos - $origin_left_pos + 1; 
$temp_left_position = $origin_left_pos; 

$distance = $new_left_position - $origin_left_pos; 
//backwards movement must account for new space 
if($distance < 0){ 

    $distance -= $width; 
    $temp_left_position += $width; 

} 
// 
$update_sql1 = "update categories set left_node = left_node+$width where left_node >= $new_left_position"; 

$update_sql2 = "update categories set right_node = right_node+$width where right_node >= $new_left_position"; 

// 
$update_sql3 = "update categories set left_node = left_node+$distance , right_node = right_node+$distance where left_node >= $temp_left_position AND right_node < $temp_left_position+$width"; 

// 
$update_sql4 = "update categories set left_node = left_node-$width where left_node > $origin_right_pos"; 
$update_sql5 = "update categories set right_node = right_node-$width where right_node > $origin_right_pos"; 

// 

$this->db->trans_start(); 

$this->db->query($update_sql1); 

// 
$this->db->query($update_sql2); 
$this->db->query($update_sql3); 
$this->db->query($update_sql4); 
$this->db->query($update_sql5); 
$this->db->trans_complete(); 

return $this->db->trans_status(); 
} 

ответ

1

Есть несколько ответов на SO именно о вашей проблеме:

Move node in nested set

Move node in Nested Sets tree

О времени ваш метод удаления принимает для запуска , 30 мс это очень мало для такого рода операций, поэтому не о чем беспокоиться. Не попадайте в ловушку premature optimization. :)

+0

Я пробую второе решение, я не могу поверить, что это работает. извините, я отвечаю поздно. потому что мне понадобился целый день, чтобы понять это. не легкая задача для меня. Кроме того, спасибо за предупреждение преждевременной оптимизации. – tyan

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