sql >> Databáze >  >> RDS >> Mysql

Dosáhněte hierarchie, vztahu rodič/dítě efektivním a snadným způsobem

Bohužel, pokud nemůžete změnit datový model a používáte MySQL, jste uvízli v situaci, kdy potřebujete rekurzivní dotazy a používáte DBMS, který nepodporuje rekurzivní dotazy.

Quassnoi napsal zajímavou sérii blogových článků, které ukazují techniky dotazování na hierarchická data. Jeho řešení jsou docela chytrá, ale velmi složitá.http:// explainextended.com/2009/03/17/hierarchical-queries-in-mysql/

PostgreSQL je další open-source RDBMS, který podporuje rekurzivní dotazy , takže můžete načíst celý strom uložený způsobem, který ukazujete. Ale pokud nemůžete změnit datový model, předpokládám, že nemůžete přejít na jiný RDBMS.

Existuje několik alternativních datových modelů, které výrazně usnadňují načítání libovolně hlubokých stromů:

  • Zavírací stůl
  • Vnořené sady aka Modified Preorder Tree Traversal
  • Výčet cesty neboli materializovaná cesta

Pokrývám je ve své prezentaci Modely pro hierarchická data s SQL a PHP a v mé knize SQL Antipatterns:Vyhýbání se nástrahám databázového programování .

Konečně je tu další řešení, které jsem viděl použité v kódu pro Slashdot , pro jejich hierarchie komentářů:Ukládají "parent_id" jako v seznamu sousedství, ale také ukládají sloupec "root_id". Každý člen daného stromu má stejnou hodnotu pro root_id, což je nejvyšší uzel předka v jeho stromu. Pak je snadné načíst celý strom jedním dotazem:

SELECT * FROM site WHERE root_id = 123;

Poté vaše aplikace načte všechny uzly zpět z databáze do pole a vy musíte napsat kód, který se bude přes toto pole opakovat, a vložit uzly do stromové datové struktury v paměti. Toto je dobré řešení, pokud máte mnoho samostatných stromů a každý strom má relativně málo položek. Je to dobré pro Slashdotův případ.



  1. Předat parametry WHERE do zobrazení PostgreSQL?

  2. Nainstalujte MySQL Workbench pro správu databáze

  3. Připojení k databázi MySQL v .NET

  4. Jak na serveru SQL Server pivotovat pro více sloupců