sql >> Databasteknik >  >> RDS >> Mysql

Hämta data med hierarkisk struktur i MySQL

MySQL saknar rekursiva frågor, som är en del av standard SQL. Många andra märken av databas stöder den här funktionen, inklusive PostgreSQL (se http://www.postgresql.org/docs/8.4/static/queries-with.html ).

Det finns flera tekniker för att hantera hierarkisk data i MySQL.

  • Enklast vore att lägga till en kolumn för att notera hierarkin som ett givet foto tillhör. Sedan kan du söka efter bilderna som tillhör samma hierarki, hämta tillbaka dem alla till din applikation och ta reda på de du behöver där. Detta är lite slösaktigt när det gäller bandbredd, kräver att du skriver mer applikationskod, och det är inte bra om dina träd har många noder.

Det finns också några smarta tekniker för att lagra hierarkisk data så att du kan fråga dem:

  • Sökvägsuppräkning lagrar listan över förfäder med varje nod. Till exempel skulle foto 5 i ditt exempel lagra "0-2-4-5". Du kan söka efter förfäder genom att söka efter noder vars sökväg sammanlänkade med "%" är en matchning för 5:s sökväg med en LIKE predikat.

  • Inkapslade uppsättningar är en komplex men smart teknik som populariserats av Joe Celko i hans artiklar och hans bok "Trees and Hierarchical in SQL for Smarties." Det finns många onlinebloggar och artiklar om det också. Det är lätt att fråga efter träd, men svårt att fråga omedelbara barn eller föräldrar och svårt att infoga eller ta bort noder.

  • Stängningstabell innebär att varje förfader/ättling-relation lagras i en separat tabell. Det är lätt att fråga efter träd, lätt att infoga och ta bort och lätt att fråga omedelbara föräldrar eller barn om du lägger till en sökväg kolumn.

Du kan se mer information som jämför dessa metoder i min presentation Praktiskt objekt -Orienterade modeller i SQL eller min kommande bok SQL Antipatterns:Avoiding the Pitfalls of Database Programming .



  1. Infoga flera tabbavgränsade textfiler i MySQL med Python?

  2. PDO Multi-query SQLSTATE[HY000]:Allmänt fel

  3. Hur man uppgraderar PostgreSQL10 till PostgreSQL11 med noll driftstopp

  4. ORA-21700:objektet finns inte eller är markerat för borttagning för Associative Array som indataparameter anropad från ODP.NET