Jaki byłby najlepszy sposób na zaimplementowanie konfigurowalnej (tj. Struktury drzewiastej z nieznaną liczbą poziomów) struktury danych w bazie danych?
Zrobiłem to raz, zanim użyłem tabeli z kluczem obcym do siebie.
Jakie inne implementacje widzisz i czy ta implementacja ma sens?
sql
database-design
tree
CodeMonkey1313
źródło
źródło
Odpowiedzi:
Wspominasz o najczęściej wdrażanym, jakim jest Lista sąsiedztwa: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets
Istnieją również inne modele, w tym zmaterializowana ścieżka i zestawy zagnieżdżone: http://communities.bmc.com/communities/docs/DOC-9902
Joe Celko napisał książkę na ten temat, która jest dobrym punktem odniesienia z ogólnej perspektywy SQL (wspomina o tym link do zagnieżdżonego artykułu powyżej).
Ponadto Itzik Ben-Gann w swojej książce „Inside Microsoft SQL Server 2005: T-SQL Querying” ma dobry przegląd najczęściej używanych opcji.
Najważniejsze kwestie do rozważenia przy wyborze modelu to:
1) Częstotliwość zmian struktury - jak często zmienia się faktyczna struktura drzewa. Niektóre modele zapewniają lepszą charakterystykę aktualizacji struktury. Ważne jest jednak, aby oddzielić zmiany struktury od innych zmian danych. Na przykład możesz chcieć modelować schemat organizacyjny firmy. Niektóre osoby modelują to jako listę kontaktów, używając identyfikatora pracownika do powiązania pracownika z jego przełożonym. Jest to zwykle podejście nieoptymalne. Podejściem, które często działa lepiej, jest modelowanie struktury organizacyjnej oddzielonej od samych pracowników i utrzymywanie pracownika jako atrybutu struktury. W ten sposób, kiedy pracownik odchodzi z firmy, sama struktura organizacyjna nie musi się zmieniać, a jedynie skojarzenie z pracownikiem, który odszedł.
2) Czy drzewo jest ciężkie do zapisu, czy do odczytu - niektóre struktury działają bardzo dobrze podczas odczytywania struktury, ale powodują dodatkowe obciążenie podczas zapisywania do struktury.
3) Jakie rodzaje informacji musisz uzyskać ze struktury - niektóre struktury są doskonałe w dostarczaniu pewnego rodzaju informacji o strukturze. Przykłady obejmują znalezienie węzła i wszystkich jego elementów podrzędnych, znalezienie węzła i wszystkich jego rodziców, znalezienie liczby węzłów podrzędnych spełniających określone warunki itp. Musisz wiedzieć, jakie informacje będą potrzebne ze struktury, aby określić strukturę, która najlepiej pasuje Twoje potrzeby.
źródło
Spojrzeć Zarządzanie hierarchicznych danych w MySQL . Omawia dwa podejścia do przechowywania i zarządzania danymi hierarchicznymi (podobnymi do drzewa) w relacyjnej bazie danych.
Pierwsze podejście to model listy przylegania, który jest tym, co w zasadzie opisujesz: posiadanie klucza obcego, który odnosi się do samej tabeli. Chociaż to podejście jest proste, może być bardzo nieefektywne w przypadku niektórych zapytań, takich jak budowanie całego drzewa.
Drugie podejście omówione w artykule to model zbioru zagnieżdżonego. Takie podejście jest znacznie bardziej wydajne i elastyczne. Zapoznaj się z artykułem, aby uzyskać szczegółowe wyjaśnienia i przykładowe zapytania.
źródło
Jeśli musisz używać Relational DataBase do organizowania struktury drzewiastej, Postgresql ma moduł cool ltree, który zapewnia typ danych do reprezentowania etykiet danych przechowywanych w hierarchicznej strukturze drzewiastej. Stamtąd możesz wziąć pomysł (więcej informacji: http://www.postgresql.org/docs/9.0/static/ltree.html )
W powszechnym przypadku LDAP służy do organizowania rekordów w strukturze hierarchicznej.
źródło
Posiadanie stolika z obcym kluczem ma dla mnie sens.
Następnie możesz użyć wspólnego wyrażenia tabeli w języku SQL lub połączyć za pomocą wcześniejszej instrukcji w Oracle, aby zbudować drzewo.
źródło
Fantastyczny zbiór gotowych do użycia funkcji, których można używać z modelem listy sąsiedztwa, aby ułatwić życie.
http://www.artfulsoftware.com/mysqlbook/sampler/mysqled1ch20.html
źródło
Użyłem następującej implementacji na serwerze SQL SERVER 2005. Sprawdź tutaj
źródło
Jeśli ktoś, kto używa MS SQL Server 2008 i nowszych, zadaje sobie pytanie: SQL Server 2008 i nowsze mają nową funkcję „hierarchyId” zaprojektowaną specjalnie do tego zadania.
Więcej informacji na https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server
źródło