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

Извличане на данни с йерархична структура в MySQL

В MySQL липсват рекурсивни заявки, които са част от стандартния SQL. Много други марки бази данни поддържат тази функция, включително PostgreSQL (вижте http://www.postgresql.org/docs/8.4/static/queries-with.html ).

Има няколко техники за работа с йерархични данни в MySQL.

  • Най-простото би било да добавите колона, за да отбележите йерархията, към която принадлежи дадена снимка. След това можете да потърсите снимките, които принадлежат към една и съща йерархия, да ги върнете обратно във вашето приложение и да разберете нужните ви там. Това е леко разточително по отношение на честотната лента, изисква от вас да напишете повече код на приложението и не е добре, ако вашите дървета имат много възли.

Има и няколко умни техники за съхраняване на йерархични данни, така че да можете да ги запитвате:

  • Изброяване на пътя съхранява списъка на предците с всеки възел. Например снимка 5 във вашия пример ще съхранява "0-2-4-5". Можете да търсите предци, като потърсите възли, чийто път, свързан с "%", съответства на пътя на 5 с LIKE предикат.

  • Вложени набори е сложна, но умна техника, популяризирана от Джо Селко в неговите статии и книгата му „Дървета и йерархично в SQL за Smarties“. Има много онлайн блогове и статии за това. Лесно е да се правят заявки за дървета, но е трудно да се правят заявки за непосредствени деца или родители и е трудно за вмъкване или изтриване на възли.

  • Таблица за затваряне включва съхраняване на всяка връзка предшественик/наследник в отделна таблица. Лесно е да се правят заявки за дървета, лесно се вмъкват и изтриват и лесно се правят запитвания към непосредствени родители или деца, ако добавите дължина на пътя колона.

Можете да видите повече информация, сравняваща тези методи в моята презентация Practical Object -Ориентирани модели в SQL или предстоящата ми книга SQL Antipatterns:Избягване на клопките на програмирането на бази данни .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Свързването с отдалечен my Sql ми показва отказан достъп за потребител [имейл защитен] (Използване на парола:Да)

  2. Как мога да синхронизирам две MySQL таблици, които имат еднакви структури и различен сървър

  3. MySQL заявка за намиране на клиенти, които са поръчали два конкретни продукта

  4. $filter не работи в JPA/Olingo 2.0.11 с MySQL

  5. Как мога да получа броя на „върнатите“ редове от набор от резултати на съхранена процедура