2015-07-26 5 views
11

Istnieje two ways to work with hierarchy data in MySQL:Model listy bliskości kontra zagnieżdżony model zestawu dla danych hierarchicznych MySQL?

  1. adjacency Lista model
  2. model zbiorów zagnieżdżonych

Głównym problemem adjacency listy Model jest to, że musimy uruchomić jedną kwerendę dla każdego węzła, aby uzyskać ścieżka hierarchii.

W model zbiorów zagnieżdżonych ten problem nie istnieje, ale dla każdego dodanego węzła jest niezbędne do uzyskania UPDATE MySQL na wszystkich innych pozostawionych i właściwą wartość.

Moje dane hierarchiczne nie są statycznymi danymi, takimi jak kategorie produktów e-commerce. Są stałą rejestracją użytkowników w hierarchicznej kolejności.

W mojej aplikacji, mimo że istnieje wiele rejestracji użytkowników stałych, muszę również uzyskać hierarchiczną ścieżkę, aż dotrę do pierwszego węzła w hierarchii.

Analizując moją sytuację, która z dwóch alternatyw byłaby najlepsza dla mojego wniosku?

Odpowiedz

16

Zagnieżdżony model zestawu nie jest obecnie używany powszechnie w bazach danych, ponieważ jest bardziej złożony niż model listy adiacentowej, ponieważ wymaga zarządzania dwoma "wskaźnikami" zamiast pojedynczego. W rzeczywistości zagnieżdżony model zestawu został wprowadzony do baz danych, gdy było skomplikowane lub niemożliwe było wykonywanie zapytań rekursywnych, które przeszły przez hierarchię.

Od 1999 roku, standard SQL obejmują tzw rekurencyjne wspólnym stole wyrażeń lub rekurencyjne CTE, co czyni bardziej proste (!) I standaryzowany do zapytań, przebiegające rekurencyjną ścieżkę w hierarchii z żadnego liczbę poziomów.

Wszystkie główne systemy DBMS zawarły teraz tę funkcję, z wyjątkiem: MySQL. Ale w MySQL można pokonać ten problem za pomocą procedur przechowywanych. Zobacz na przykład this post on StackOverflow lub this post on dba.stackexchange.

Tak, w skrócie, to są moje porady:

  1. Jeśli można jeszcze zdecydować, które DBMS wykorzystania, należy rozważyć silnie kilka alternatyw: na przykład, jeśli chcesz, aby trzymać się z bazy danych open source, należy PostgreSQL , skorzystaj z Modelu listy Adiacency i przejdź do rekurencyjnych CTE dla swoich zapytań.
  2. Jeśli nie możesz zmienić DBMS, nadal powinieneś pójść z Modelem listy pomocniczej i używać procedur zapisanych w bazie jak cytowane w odnośnikach.

UPDATE

Sytuacja ta zmienia się z MySQL 8, która jest obecnie w developerski i które will integrate Recursive CTEs, tak że od tej wersji model zbiorów zagnieżdżonych będzie bardziej prosty w użyciu.

+0

Dla tego, co jest warte, MySQL 8, obecnie w fazie rozwoju, będzie obsługiwał rekurencyjne zapytania CTE. –

+0

@BillKarwin, wielkie dzięki za informację, zaktualizowałem odpowiedź. – Renzo