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

Какви са известните начини за съхраняване на дървовидна структура в релационна БД?

Както винаги:няма най-добро решение. Всяко решение прави различни неща по-лесни или по-трудни. Правилното решение за вас зависи от това коя операция ще извършите най-много.

Наивен подход с идентификатор на родител:

Плюсове:

  • Лесен за изпълнение

  • Лесно преместване на голямо поддърво към друг родител

  • Вложката е евтина

  • Необходими полета, достъпни директно в SQL

Минуси:

  • Извличането на цяло дърво е рекурсивно и следователно скъпо

  • Намирането на всички родители също е скъпо ( SQL не познава рекурсии... )

Променено обхождане на дървото за предварителна поръчка (запазване на начална и крайна точка) :

Плюсове:

  • Извличането на цяло дърво е лесно и евтино

  • Намирането на всички родители е евтино

  • Необходими полета, достъпни директно в SQL

  • Бонус:вие запазвате реда на дъщерните възли и в неговия родителски възел

Минуси:

  • Вмъкването/актуализирането може да бъде много скъпо, тъй като може би ще трябва да актуализирате много възли

Запазване на път във всеки възел:

Плюсове:

  • Намирането на всички родители е евтино

  • Извличането на цяло дърво е евтино

  • Вмъкването е евтино

Минуси:

  • Преместването на цяло дърво е скъпо

  • В зависимост от начина, по който запазвате пътя, няма да можете да работите с него директно в SQL, така че винаги ще трябва да го извличате и анализирате, ако искате да го промените.

Маса за затваряне

Плюсове:

  • Лесен за изпълнение

  • Намирането на всички родители е евтино

  • Вмъкването е евтино

  • Извличането на цели дървета е евтино

Минуси:

  • Нуждае се от допълнителна маса

  • Заема много място в сравнение с други подходи

  • Преместването на поддърво е скъпо

Бих предпочел един от последните две, в зависимост от това колко често се променят данните.

Вижте също:http://media.pragprog.com/titles/bksqla/trees. pdf



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Принудително InnoDB да проверява отново външни ключове на таблица/таблици?

  2. PDO + MySQL и счупено UTF-8 кодиране

  3. Python SQL – Как да използвате SQLite, MySQL и PostgreSQL бази данни с Python

  4. MySQL Group By и Order By

  5. Най-често срещаните MySQL заявки