Design Nested Sets je rozhodně obtížný, když potřebujete často aktualizovat strom. Nakonec budete muset přečíslovat velké části stromu.
Jedním z návrhů pro zmírnění tohoto je použití čísel s plovoucí desetinnou čárkou namísto celých čísel. Pokud do stromu vložíte nový uzel, je relativně snadné najít nějaká FLOAT čísla mezi vnořená čísla sady rodiče nového uzlu. Možná se nakonec dostanete na hranice přesnosti čísla s plovoucí desetinnou čárkou, ale protože váš strom není příliš hluboký, nestane se to ještě dlouho.
Další technika, o které jsem psal, nazývám Closure Table . Tento způsob ukládání hierarchií usnadňuje vkládání/aktualizaci/mazání uzlů ve velkém stromu, aniž by bylo nutné aktualizovat velké množství stromu. A stále můžete dotazovat celý strom nebo jakýkoli podstrom v jediném nerekurzivním SQL dotazu.
Chcete-li si přečíst více o tabulce uzavření, viz:
- Jaký je nejúčinnější/nejelegantnější způsob, jak analyzovat plochý stůl do stromu?
- Modely pro hierarchická data s SQL a PHP
- Přesouvání podstromů v hierarchiích uzavíracích tabulek
- SQL Antipatterns:Vyhýbání se nástrahám databázového programování
K vašemu komentáři:
Adjacency List je jednoduchý, má minimální redundanci a podporuje FK vztahy, což Nested Sets ne. Adjacency List podporuje dotazování na celý strom libovolné hloubky, pokud používáte rekurzivní dotazy . MySQL však nepodporuje rekurzivní dotazy.
Pokud potřebujete dotazovat pouze bezprostřední vztahy rodič-dítě (tj. jedna úroveň hloubky), nebo jinak dotazovat pouze stromy pevné hloubky, pak je seznam sousedství v pořádku.