sql >> Databasteknik >  >> RDS >> Mysql

Uppnå hierarki, förälder/barnrelation på ett effektivt och enkelt sätt

Tyvärr, om du inte kan ändra datamodellen och du använder MySQL, har du fastnat i en situation där du behöver rekursiva frågor och du använder ett DBMS som inte stöder rekursiva frågor.

Quassnoi skrev en intressant serie bloggartiklar som visade tekniker för att söka efter hierarkisk data. Hans lösningar är ganska smarta, men mycket komplexa.http:// explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL är ett annat RDBMS med öppen källkod, som stöder rekursiva frågor a> , så att du kan hämta ett helt träd lagrat på det sätt du visar. Men om du inte kan ändra datamodellen, skulle jag anta att du inte kan byta till en annan RDBMS.

Det finns flera alternativa datamodeller som gör det mycket lättare att hämta godtyckligt djupa träd:

  • Stängningstabell
  • Inkapslade uppsättningar aka Modified Preorder Tree Traversal
  • Path Enumeration aka Materialized Path

Jag tar upp dessa i min presentation Modeller för hierarkisk data med SQL och PHP , och i min bok SQL Antipatterns:Avoiding the Pitfalls of Database Programming .

Slutligen finns det en annan lösning som jag har sett användas i koden för Slashdot , för sina kommentarshierarkier:De lagrar "parent_id" som i Adjacency List, men de lagrar också en "root_id" kolumn. Varje medlem i ett givet träd har samma värde för root_id, som är den högsta förfadernoden i dess träd. Då är det lätt att hämta ett helt träd i en fråga:

SELECT * FROM site WHERE root_id = 123;

Sedan hämtar din applikation tillbaka alla noder från databasen till en array, och du måste skriva koden för att loopa över denna array och infoga noderna i en träddatastruktur i minnet. Detta är en bra lösning om du har många separata träd och varje träd har relativt få poster. Det är bra för Slashdots fall.



  1. Hur använder jag ROW_NUMBER()?

  2. Hur kontrollerar jag om filen är en bild som använder PL/SQL?

  3. Postgres skiftlägeskänslighet

  4. Hur Atand() fungerar i PostgreSQL