sql >> Databáze >  >> RDS >> PostgreSQL

klonování hierarchických dat

Vytahování tohoto výsledku rekurzivně je složité (i když možné). Obvykle to však není příliš efektivní a je toho hodně lepší způsob, jak tento problém vyřešit.

V podstatě tabulku rozšíříte o další sloupec, který sleduje strom až nahoru - budu to nazývat "Upchain". Je to jen dlouhý řetězec, který vypadá asi takto:

name | id | parent_id | upchain
root1 | 1 | NULL | 1:
root2 | 2 | NULL | 2:
root1sub1 | 3 | 1 | 1:3:
root1sub2 | 4 | 1 | 1:4:
root2sub1 | 5 | 2 | 2:5:
root2sub2 | 6 | 2 | 2:6:
root1sub1sub1 | 7 | 3 | 1:3:7:

Je velmi snadné udržovat toto pole aktualizované pomocí spouštěče na stole. (Omlouvám se za terminologii, ale vždy jsem to dělal s SQL Serverem). Pokaždé, když přidáte nebo odstraníte záznam nebo aktualizujete pole parent_id, stačí aktualizovat pole upchain v této části stromu. To je triviální práce, protože stačí vzít upchain nadřazeného záznamu a připojit id aktuálního záznamu. Všechny podřízené záznamy lze snadno identifikovat pomocí LIKE ke kontrole záznamů s počátečním řetězcem v jejich upchain.

To, co děláte efektivně, je, že vyměňujete trochu extra zapisovací aktivity za velké ukládání, když si přijdete data přečíst.

Když chcete vybrat kompletní větev ve stromu, je to triviální. Předpokládejme, že chcete větev pod uzlem 1. Uzel 1 má upchain '1:', takže víte, že jakýkoli uzel ve větvi stromu pod tímto uzlem musí mít upchain začínající '1:...'. Takže udělejte toto:

SELECT *
FROM table
WHERE upchain LIKE '1:%'

To je extrémně rychle (samozřejmě indexujte pole upchain). Jako bonus to také velmi zjednodušuje mnoho činností, jako je hledání dílčích stromů, úrovně ve stromu atd.

Použil jsem to v aplikacích, které sledují velké hierarchie hlášení zaměstnanců, ale můžete to použít pro téměř jakoukoli stromovou strukturu (rozdělení částí atd.)

Poznámky (pro každého, kdo má zájem):

  • Neuvedl jsem krok za krokem kód SQL, ale jakmile pochopíte princip, je docela snadné jej implementovat. Nejsem skvělý programátor, takže mluvím z vlastní zkušenosti.
  • Pokud již máte data v tabulce, musíte provést jednorázovou aktualizaci, aby se upchainy zpočátku synchronizovaly. Opět to není obtížné, protože kód je velmi podobný kódu UPDATE ve spouštěčích.
  • Tato technika je také dobrým způsobem, jak identifikovat kruhové odkazy, které by jinak bylo obtížné najít.


  1. Jak zabezpečit servery MySQL/MariaDB

  2. MySQL uděluje databázi všechna oprávnění kromě jedné tabulky

  3. Nelze se připojit k MySQL přes Nodejs

  4. Oracle SQL Developer kopírování databáze krok za krokem