2009-03-29 18 views
8

Jakie są "najlepsze praktyki" w zakresie zapisywania wzorów złożonych w relacyjnej bazie danych?Przechowywanie złożonych wzorów (danych hierarchicznych) w bazie danych

Używamy zmodyfikowanego drzewa przedpremierowego. To bardzo szybko budować całe drzewo, ale bardzo wolno wstawiać lub usuwać nowe węzły (wszystkie lewe i prawe wartości należy dostosować). Zapytanie dzieci węzła nie jest łatwe i bardzo powolne.

Inną rzeczą, którą zauważyliśmy, jest to, że naprawdę musisz upewnić się, że drzewo nie jest nieprzyjemne. Potrzebujesz blokad transakcji, w przeciwnym razie wartości po lewej i prawej stronie mogą ulec uszkodzeniu, a naprawienie uszkodzonego drzewa po lewej stronie nie jest zadaniem łatwym.

Działa to jednak bardzo dobrze, ale zmodyfikowane preorderowanie drzewiastego preorderu, ale zastanawiałem się, czy istnieją lepsze alternatywy.

+0

Ir zależy trochę od rodzaju zapytań, które są najczęściej używane. –

Odpowiedz

6

Podczas znajdowania wszystkich potomków rzędu z MPTT jest szybki, znalezienie wszystkich dzieci może być wolne. Jednak powinieneś być w stanie to naprawić, dodając pole parent_id do tabeli, które rejestruje (tak, redundantnie) element nadrzędny wiersza. Wtedy staje się poszukiwanie:

SELECT * 
FROM tbl 
WHERE parent_id = z 

Tak parent_id zawiera zbędnych informacji, potencjalnie denormalizing stolika - ale od każdej Wstaw/aktualizacja/delete już wymaga globalnych zmian, utrzymując parent_id up-to-date nie jest dużo ekstra płacić. Alternatywnie można użyć pola level, które rejestruje pionowy poziom wiersza, chociaż jest to w rzeczywistości zmienne pod pewnymi typami transformacji (na przykład przeniesienie poddrzewa do innego punktu w drzewie).

Równina stary reprezentacja Link do rodzica (czyli tylko o parent_id ani left_pos lub right_pos), jest oczywiście szybsze insert/update ciężkich obciążeń, ale jedyne pytania może odpowiedzieć skutecznie są „Pokaż rodzica X "i" Znajdź dzieci X ". Większość obciążeń wymaga dużo więcej czytania niż pisania, więc zwykle MPTT jest szybszy ogólnie - ale może w twoim przypadku musisz rozważyć przeniesienie ("powrót") do łącza do rodzica?

0

Najlepszym sposobem na przechowywanie hierakialnych danych w bazie danych, o której słyszałem, jest użycie atrybutu ciągu, w którym treść jest listą rodziców oddzielonych dwukropkiem.

Powiązane problemy