sql >> Database >  >> RDS >> Mysql

Bereik hiërarchie, ouder-kindrelatie op een effectieve en gemakkelijke manier

Als u het gegevensmodel niet kunt wijzigen en u gebruikt MySQL, zit u helaas in een situatie waarin u recursieve zoekopdrachten nodig hebt en een DBMS gebruikt dat geen recursieve zoekopdrachten ondersteunt.

Quassnoi schreef een interessante serie blogartikelen, waarin technieken worden getoond voor het opvragen van hiërarchische gegevens. Zijn oplossingen zijn heel slim, maar zeer complex.http:// Explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL is een ander open-source RDBMS, dat recursieve zoekopdrachten ondersteunt , dus je zou een hele boom kunnen ophalen die is opgeslagen op de manier die je laat zien. Maar als u het gegevensmodel niet kunt wijzigen, neem ik aan dat u niet kunt overschakelen naar een ander RDBMS.

Er zijn verschillende alternatieve datamodellen die het veel gemakkelijker maken om willekeurig diepe bomen op te halen:

  • Sluitingstabel
  • Nested Sets oftewel Modified Preorder Tree Traversal
  • Path Enumeration oftewel gematerialiseerd pad

Ik behandel deze in mijn presentatie Modellen voor hiërarchische gegevens met SQL en PHP , en in mijn boek SQL Antipatterns:Avoiding the Pitfalls of Database Programming .

Ten slotte is er nog een andere oplossing die ik heb gezien in de code voor Slashdot , voor hun commentaarhiërarchieën:ze slaan "parent_id" op zoals in de Adjacency List, maar ze slaan ook een "root_id" kolom op. Elk lid van een bepaalde boom heeft dezelfde waarde voor root_id, wat het hoogste voorouderknooppunt in zijn boom is. Dan is het gemakkelijk om in één zoekopdracht een hele boom op te halen:

SELECT * FROM site WHERE root_id = 123;

Vervolgens haalt uw toepassing alle knooppunten terug uit de database in een array, en u moet de code schrijven om over deze array te lussen, waarbij de knooppunten in een boomgegevensstructuur in het geheugen worden ingevoegd. Dit is een goede oplossing als u veel afzonderlijke bomen heeft en elke boom relatief weinig vermeldingen heeft. Het is goed voor de zaak van Slashdot.



  1. Lijst met tabellen in een PostgreSQL-schema

  2. PostgreSQL kan geen transacties beginnen/beëindigen in PL/pgSQL

  3. MySQL ASIN() Functie – Retourneer de boogsinus van een getal

  4. Gegroepeerde tekenreeksaggregatie / LISTAGG voor SQL Server