Struktura bazy danych dla struktury danych drzewa

Jaki byłby najlepszy sposób na zaimplementowanie konfigurowalnej (czyli struktury drzewa o nieznanej liczbie poziomów) struktury danych drzewa w bazie danych?

Zrobiłem to raz, zanim użyłem tabeli z obcym kluczem do siebie.

Jakie inne implementacje mógłbyś zobaczyć i czy ta implementacja ma sens?

Author: CodeMonkey1313, 2009-06-01

6 answers

Wymieniasz najczęściej implementowaną, czyli listę: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

Istnieją również inne modele, w tym zmaterializowane ścieżki i zagnieżdżone zestawy: http://communities.bmc.com/communities/docs/DOC-9902

Joe Celko napisał książkę na ten temat, która jest dobrym odniesieniem z ogólnej perspektywy SQL (jest wspomniana w zagnieżdżonym zestawie artykuł link powyżej).

Itzik Ben-Gann ma również dobry przegląd najczęstszych opcji w swojej książce "Inside Microsoft SQL Server 2005: T-SQL Querying".

Główne rzeczy, które należy wziąć pod uwagę przy wyborze modelu to:

1) częstotliwość zmian struktury-jak często zmienia się rzeczywista struktura drzewa. Niektóre modele zapewniają lepszą charakterystykę aktualizacji struktury. Ważne jest jednak oddzielenie zmian struktury od innych zmian danych. Na przykład, możesz chcesz modelować schemat organizacyjny firmy. Niektórzy ludzie będą modelować to jako listę przyległości, używając identyfikatora pracownika, aby powiązać pracownika z przełożonym. Zazwyczaj jest to podejście nieoptymalne. Podejście, które często działa lepiej, polega na modelowaniu struktury organizacji niezależnie od samych pracowników i utrzymywaniu pracownika jako atrybutu struktury. W ten sposób, gdy pracownik opuszcza firmę, sama struktura organizacyjna nie musi być zmieniana, tylko stowarzyszenie z pracownikiem, który odszedł.

2) jest Tree write-heavy lub read-heavy-niektóre struktury działają bardzo dobrze podczas czytania struktury, ale ponoszą dodatkowe koszty podczas pisania do struktury.

3) Jakie rodzaje informacji należy uzyskać ze struktury-niektóre struktury sprawdzają się w dostarczaniu określonych rodzajów informacji o strukturze. Przykłady obejmują znalezienie węzła i wszystkich jego dzieci, znalezienie węzła i wszystkich jego rodziców, znalezienie liczby węzłów potomnych spełniających określone warunki itp. Musisz wiedzieć, jakie informacje będą potrzebne ze struktury, aby określić strukturę, która najlepiej pasuje do Twoich potrzeb.

 68
Author: JeremyDWill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 21:58:40

Spójrz na Zarządzanie danymi hierarchicznymi w MySQL . Omawia dwa podejścia do przechowywania danych hierarchicznych (drzewiastych) i zarządzania nimi w relacyjnej bazie danych.

Pierwszym podejściem jest model listy adiacenckiej, który zasadniczo opisujesz: posiadanie klucza obcego, który odnosi się do samej tabeli. Chociaż takie podejście jest proste, może być bardzo nieefektywne dla niektórych zapytań, takich jak budowanie całego drzewa.

Drugie podejście omówione w artykule to zagnieżdżony model zestawu. Takie podejście jest o wiele bardziej efektywne i elastyczne. Szczegółowe wyjaśnienia i przykładowe zapytania można znaleźć w artykule.

 51
Author: Ayman Hourieh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-21 22:18:11

Jeśli musisz użyć relacyjnej bazy danych do porządkowania drzewiastej struktury danych, Postgresql ma fajny moduł ltree, który zapewnia typ danych do reprezentowania etykiet danych przechowywanych w hierarchicznej strukturze przypominającej drzewo. Stamtąd możesz się zorientować.(Więcej informacji: http://www.postgresql.org/docs/9.0/static/ltree.html )

W powszechnym LDAP jest używany do organizowania rekordów w strukturze hierarchicznej.

 8
Author: yurilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-14 16:15:07

Posiadanie stolika z obcym kluczem do siebie ma dla mnie sens.

Możesz następnie użyć wspólnego wyrażenia tabeli w SQL lub instrukcji connect by prior w Oracle do zbudowania drzewa.

 2
Author: Aaron Daniels,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-01 14:55:10

Fantastyczny zbiór gotowych do użycia funkcji, które mogą być używane z modelem listy adiacenckiej, aby ułatwić życie.

Http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html

 2
Author: Darshan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-27 07:56:47

Użyłem następującej implementacji na SQL SERVER 2005. Sprawdź Tutaj

 1
Author: emzero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:14