2017-04-04 92 views
6

Próbuję utworzyć bazę danych, w której może być n liczba kategorii, a także ich podkategorie.Implementacja zestawu zagnieżdżonych zestawów w MySQL/PHP

Najpierw starałem się tworzyć bazy danych modelu sąsiedztwa jak ten

+-------------+----------------------+--------+ 
| category_id | name     | parent | 
+-------------+----------------------+--------+ 
|   1 | Electronics   | NULL | 
|   2 | Mobile    |  1 | 
|   3 | Washing Machine  |  1 | 
|   4 | Samsung    |  2 | 
+-------------+----------------------+--------+ 

ale byłem w obliczu problemu podczas usuwania węzła, podobnie jak zarządzać węzły potomne dla usuniętych węzłów itp

następnie Próbuję zaimplementować zagnieżdżony kolejności określonej przez Joe Celko sample_structure

struktur tabel w każdym rysunku:

Figure 1: 
+----+-------------+-----+-----+ 
| id | name  | lft | rgt | 
+----+-------------+-----+-----+ 
| 1 | Electronics | 1 | 2 | 
+----+-------------+-----+-----+ 

Figure 2: 
+----+-------------+-----+-----+ 
| id | name  | lft | rgt | 
+----+-------------+-----+-----+ 
| 1 | Electronics | 1 | 4 | 
+----+-------------+-----+-----+ 
| 2 | Mobile  | 2 | 3 | 
+----+-------------+-----+-----+ 

Figure 3: 
+----+-----------------+-----+-----+ 
| id | name   | lft | rgt | 
+----+-----------------+-----+-----+ 
| 1 | Electronics  | 1 | 6 | 
+----+-----------------+-----+-----+ 
| 2 | Mobile   | 2 | 3 | 
+----+-----------------+-----+-----+ 
| 3 | Washing Machine | 4 | 5 | 
+----+-----------------+-----+-----+ 

Figure 4: 
+----+-----------------+-----+-----+ 
| id | name   | lft | rgt | 
+----+-----------------+-----+-----+ 
| 1 | Electronics  | 1 | 8 | 
+----+-----------------+-----+-----+ 
| 2 | Mobile   | 2 | 5 | 
+----+-----------------+-----+-----+ 
| 3 | Washing Machine | 6 | 7 | 
+----+-----------------+-----+-----+ 
| 4 | Samsung   | 3 | 4 | 
+----+-----------------+-----+-----+ 

ale nie mogę wstawić nowego węzła z poprawnymi rgt i lft. Używam tego, ale to nie generuje właściwych wartości rgt i lft.

LOCK TABLE nested_category WRITE; 

SELECT @myRight := rgt FROM nested_category 
WHERE name = 'Mobile'; 

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight; 
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight; 

INSERT INTO nested_category(name, lft, rgt) VALUES('LG', @myRight + 1, @myRight + 2); 

UNLOCK TABLES; 
+0

Jak chcesz zarządzać węzły podrzędne? Czy stają się dziećmi ich dziadków lub po prostu zostają usunięte z rodzicem? –

+0

Zostań dzieckiem dziadków – jpm

+0

Co powinno się stać, jeśli węzeł główny zostanie usunięty, nawet jeśli przypadkowo? –

Odpowiedz

4

Ten numer http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ jest Twoim kodem źródłowym?

Nie używasz dobrego zapytania, to jest add a brother node.

Jesteś po add a child node:

LOCK TABLE nested_category WRITE; 

SELECT @myLeft := lft FROM nested_category 
WHERE name = 'Mobile'; 

UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft; 
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft; 

INSERT INTO nested_category(name, lft, rgt) VALUES('LG', @myLeft + 1, @myLeft + 2); 

UNLOCK TABLES; 
0
CREATE PROCEDURE nested_insert(_name VARCHAR(45)) 
BEGIN 
DECLARE _number int; 
set @var=0; 

-- first insert paramater value(_name) into nested_table 
INSERT into nested_table(name) VALUE(_name); 

-- count the total row value from nested table; 
SELECT count(*) from nested_table into _number; 

-- first update the all lft column from top to button by varibale with increment 
UPDATE nested_table set lft=(@var:[email protected]+1) where id <=_number; 

-- second update the all rgt column from button to top by varibale with increment in descending order id 
UPDATE nested_table set rgt=(@var:[email protected]+1) where id<=(_number+1)*2 ORDER BY id desc ; 
end;