Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Osiągnij hierarchię, relacje rodzic/dziecko w skuteczny i łatwy sposób

Niestety, jeśli nie możesz zmienić modelu danych i używasz MySQL, utknąłeś w sytuacji, w której potrzebujesz zapytań rekurencyjnych i używasz DBMS, który nie obsługuje zapytań rekurencyjnych.

Quassnoi napisał ciekawą serię artykułów na blogu, pokazując techniki wyszukiwania danych hierarchicznych. Jego rozwiązania są dość sprytne, ale bardzo złożone.http:// explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL to kolejny RDBMS typu open source, który obsługuje zapytania rekurencyjne , więc możesz pobrać całe drzewo przechowywane w sposób, który pokazujesz. Ale jeśli nie możesz zmienić modelu danych, zakładam, że nie możesz przełączyć się na inny RDBMS.

Istnieje kilka alternatywnych modeli danych, które znacznie ułatwiają pobieranie drzew o dowolnej głębokości:

  • Tabela zamknięcia
  • Zagnieżdżone zestawy, czyli zmodyfikowane przechodzenie przez drzewo zamówień w przedsprzedaży
  • Enumeracja ścieżki, czyli zmaterializowana ścieżka

Opisuję je w mojej prezentacji Modele danych hierarchicznych z SQL i PHP oraz w mojej książce Antywzorce SQL:unikanie pułapek programowania baz danych .

Wreszcie, jest inne rozwiązanie, które widziałem w kodzie Slashdot , dla ich hierarchii komentarzy:Przechowują „parent_id” jak na liście sąsiedztwa, ale przechowują również kolumnę „root_id”. Każdy członek danego drzewa ma taką samą wartość dla root_id, który jest najwyższym węzłem przodka w jego drzewie. Wtedy łatwo jest pobrać całe drzewo za pomocą jednego zapytania:

SELECT * FROM site WHERE root_id = 123;

Następnie twoja aplikacja pobiera wszystkie węzły z powrotem z bazy danych do tablicy i musisz napisać kod, aby zapętlić tę tablicę, wstawiając węzły do ​​struktury danych drzewa w pamięci. Jest to dobre rozwiązanie, jeśli masz wiele oddzielnych drzew, a każde drzewo ma stosunkowo mało wpisów. To dobre dla przypadku Slashdota.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:Jak zresetować lub zmienić hasło roota MySQL?

  2. Ważne kontrole stanu serwerów MySQL Source-Replica

  3. Jak uzyskać liczbę wierszy w tabeli MySQL za pomocą PHP?

  4. Co to jest CHAR_LENGTH() w MySQL?

  5. Konwertuj BufferedInputStream na obraz