Mysql
 sql >> база данни >  >> RDS >> Mysql

Постигнете йерархия, взаимоотношения родител/дете по ефективен и лесен начин

За съжаление, ако не можете да промените модела на данни и използвате MySQL, вие сте заседнали в ситуация, в която имате нужда от рекурсивни заявки и използвате СУБД, която не поддържа рекурсивни заявки.

Quassnoi написа интересна серия от статии в блогове, показващи техники за запитване на йерархични данни. Решенията му са доста умни, но много сложни.http:// objasniextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL е друга RDBMS с отворен код, която поддържа рекурсивни заявки , така че можете да извлечете цяло дърво, съхранено по начина, който показвате. Но ако не можете да промените модела на данни, предполагам, че не можете да превключите към друга RDBMS.

Има няколко алтернативни модела на данни, които правят много по-лесно извличането на произволно дълбоки дървета:

  • Таблица за затваряне
  • Вложени набори, известни още като модифицирано обхождане на дървото за предварителна поръчка
  • Изброяване на пътя, известен още като материализиран път

Разглеждам ги в презентацията си Модели за йерархични данни с SQL и PHP , и в моята книга SQL Antipatterns:Избягване на клопките на програмирането на бази данни .

И накрая, има друго решение, което съм виждал използвано в кода за Slashdot , за техните йерархии на коментарите:Те съхраняват "parent_id" като в списъка на съседство, но също така съхраняват колона "root_id". Всеки член на дадено дърво има една и съща стойност за root_id, който е най-високият възел-предшественик в неговото дърво. Тогава е лесно да извлечете цяло дърво с една заявка:

SELECT * FROM site WHERE root_id = 123;

След това вашето приложение извлича всички възли обратно от базата данни в масив и вие трябва да напишете кода, за да обиколите този масив, като вмъкнете възлите в дървовидна структура от данни в паметта. Това е добро решение, ако имате много отделни дървета и всяко дърво има сравнително малко записи. Това е добре за случая на Slashdot.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да преглеждам MySQL резултатен набор повече от веднъж, използвайки функциите mysql_*?

  2. Пълно възстановяване на MySQL или MariaDB Galera клъстер от архивиране

  3. Как да инсталирате MySQL 8.0 на CentOS 8 / RHEL 8

  4. Как да покажа съпоставянето на таблица в MySQL

  5. Урок за MySQL:MySQL IN клауза (основна)