sql >> Database teknologi >  >> RDS >> Mysql

Opnå hierarki, forældre/barn forhold på en effektiv og nem måde

Desværre, hvis du ikke kan ændre datamodellen, og du bruger MySQL, sidder du fast i en situation, hvor du har brug for rekursive forespørgsler, og du bruger et DBMS, der ikke understøtter rekursive forespørgsler.

Quassnoi skrev en interessant serie af blogartikler, der viser teknikker til at forespørge på hierarkiske data. Hans løsninger er ret smarte, men meget komplekse.http:// explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL er en anden open source RDBMS, som understøtter rekursive forespørgsler a> , så du kunne hente et helt træ gemt på den måde, du viser. Men hvis du ikke kan ændre datamodellen, vil jeg antage, at du ikke kan skifte til en anden RDBMS.

Der er flere alternative datamodeller, der gør det meget nemmere at hente vilkårligt dybe træer:

  • Lukningstabel
  • Indlejrede sæt aka Modified Preorder Tree Traversal
  • Path Enumeration aka Materialized Path

Jeg dækker disse i min præsentation Modeller for hierarkiske data med SQL og PHP , og i min bog SQL Antipatterns:Avoiding the Pitfalls of Database Programming .

Endelig er der en anden løsning, som jeg har set brugt i koden til Slashdot , for deres kommentarhierarkier:De gemmer "parent_id" ligesom i Adjacency List, men de gemmer også en "root_id" kolonne. Hvert medlem af et givet træ har den samme værdi for root_id, som er den højeste forfaderknude i træet. Så er det nemt at hente et helt træ i én forespørgsel:

SELECT * FROM site WHERE root_id = 123;

Derefter henter din applikation alle noderne tilbage fra databasen til et array, og du skal skrive koden til at sløjfe over dette array, og indsætte noderne i en trædatastruktur i hukommelsen. Dette er en god løsning, hvis du har mange separate træer, og hvert træ har relativt få indgange. Det er godt for Slashdots tilfælde.



  1. NOT NULL begrænsning over et sæt kolonner

  2. Få forrige og næste række fra rækker valgt med (WHERE) betingelser

  3. pg_dump postgres-database fra fjernserver, når port 5432 er blokeret

  4. JSON_CONTAINS() Eksempler i MySQL