sql >> Database >  >> RDS >> Mysql

Gegevens ophalen met een hiërarchische structuur in MySQL

MySQL mist recursieve queries, die deel uitmaken van standaard SQL. Veel andere databasemerken ondersteunen deze functie, waaronder PostgreSQL (zie http://www.postgresql.org/docs/8.4/static/queries-with.html ).

Er zijn verschillende technieken voor het verwerken van hiërarchische gegevens in MySQL.

  • Het eenvoudigst zou zijn om een ​​kolom toe te voegen om de hiërarchie te noteren waartoe een bepaalde foto behoort. Vervolgens kunt u zoeken naar de foto's die tot dezelfde hiërarchie behoren, ze allemaal terughalen naar uw toepassing en uitzoeken welke u daar nodig heeft. Dit is een beetje verspilling in termen van bandbreedte, vereist dat je meer applicatiecode schrijft en het is niet goed als je bomen veel knooppunten hebben.

Er zijn ook een paar slimme technieken om hiërarchische gegevens op te slaan, zodat u ze kunt opvragen:

  • Padtelling slaat de lijst met voorouders op bij elk knooppunt. Foto 5 in uw voorbeeld zou bijvoorbeeld "0-2-4-5" opslaan. U kunt naar voorouders zoeken door te zoeken naar knooppunten waarvan het pad aaneengeschakeld met "%" overeenkomt met het pad van 5 met een LIKE predikaat.

  • Geneste sets is een complexe maar slimme techniek die gepopulariseerd is door Joe Celko in zijn artikelen en zijn boek "Trees and Hierarchical in SQL for Smarties." Er zijn ook talloze online blogs en artikelen over. Het is gemakkelijk om bomen te doorzoeken, maar moeilijk om directe kinderen of ouders te doorzoeken en moeilijk om knooppunten in te voegen of te verwijderen.

  • Sluitingstabel houdt in dat elke voorouder/afstammeling-relatie in een aparte tabel wordt opgeslagen. Het is gemakkelijk om bomen te doorzoeken, gemakkelijk in te voegen en te verwijderen, en gemakkelijk om directe ouders of kinderen te doorzoeken als u een padlengte toevoegt kolom.

U kunt meer informatie zien die deze methoden vergelijkt in mijn presentatie Practical Object -Georiënteerde modellen in SQL of mijn aankomende boek SQL Antipatterns:Avoiding the Pitfalls of Database Programming .



  1. Verbeter de afstemming van SQL Server-prestaties met deze 3 tips

  2. Uitvoeringstijd van testquery's in laravel

  3. Een script om alle tabellen en velden te wijzigen in de utf-8-bin-sortering in MYSQL

  4. MySQL:controleer of de gebruiker bestaat en laat deze vallen