Хороший огляд
Взагалі кажучи, ви приймаєте рішення між часом швидкого читання (наприклад, вкладеним набором) або часом швидкого запису (список суміжності). Зазвичай у вас є комбінація наведених нижче варіантів, які найкраще відповідають вашим потребам. Нижче наведено деяке поглиблене читання:
- Ще одне порівняння вкладених інтервалів та списку суміжності : найкраще порівняння списку суміжності, матеріалізованого шляху, вкладеного набору та вкладеного інтервалу, який я знайшов.
- Моделі ієрархічних даних : слайди з чіткими поясненнями компромісів та прикладом використання
- Представлення ієрархій в MySQL : особливо хороший огляд вкладеного набору
- Ієрархічні дані в RDBMS : найбільш вичерпний і добре організований набір посилань, які я бачив, але не дуже на шляху пояснення
Параметри
Мені відомі і загальні риси:
- Список суміжності :
- Стовпці: ідентифікатор, ParentID
- Легкий у виконанні.
- Дешевий вузол переміщується, вставляє та видаляє.
- Дорогий, щоб знайти рівень, рід і нащадків, шлях
- Уникайте N + 1 через загальні вирази таблиць у базах даних, які їх підтримують
- Вкладений набір (він же модифікований обхід дерева попереднього замовлення )
- Стовпці: зліва, справа
- Дешевий рід, нащадки
- Дуже дорогі
O(n/2)
ходи, вставки, видалення за рахунок летючого кодування
- Таблиця мостів (також тригери закриття / w тригери )
- Використовує окрему таблицю приєднання з: предком, нащадком, глибиною (необов'язково)
- Дешеві предки та нащадки
- Записує витрати
O(log n)
(розмір піддерева) на вставлення, оновлення, видалення - Нормалізоване кодування: добре для RDBMS-статистики та планувальників запитів приєднується
- Потрібно кілька рядків на вузол
- Стовпець рядків (він же Матеріалізований шлях , перерахування шляху)
- Стовпець: родовий (наприклад, / батько / дитина / онук / тощо ...)
- Дешеві нащадки за допомогою префіксального запиту (наприклад
LEFT(lineage, #) = '/enumerated/path'
) - Записує витрати
O(log n)
(розмір піддерева) на вставлення, оновлення, видалення - Нереляційний: спирається на тип даних масиву або серіалізований формат рядків
- Вкладені інтервали
- Як і вкладений набір, але з реальним / float / decimal, щоб кодування не було мінливим (недороге переміщення / вставка / видалення)
- Має проблеми з реальним / плаваючим / десятковим поданням / точністю
- Варіант кодування матриці додає кодування предків (матеріалізований шлях) для "вільного", але з додатковою хитрістю лінійної алгебри.
- Плоский стіл
- Модифікований список суміжності, який додає стовпець рівня та рейтингу (наприклад, замовлення) до кожного запису.
- Недорогий перегляд / пагінат
- Дороге переміщення та видалення
- Хороше використання: поточна дискусія - форуми / коментарі до блогу
- Кілька стовпців рядків
- Стовпці: по одному для кожного рівня рядка, стосується всіх батьків до кореня; рівні вниз від рівня елемента встановлюються на NULL
- Дешеві предки, нащадки, рівень
- Дешеві вставити, видалити, перемістити листя
- Дороге вставлення, видалення, переміщення внутрішніх вузлів
- Важкий обмеження наскільки глибокою може бути ієрархія
Конкретні примітки до бази даних
MySQL
Oracle
- Використовуйте CONNECT BY для переходу до списків суміжності
PostgreSQL
- ltree тип даних для Матеріалізованого Шляху
SQL Server
- Загальний підсумок
- 2008 пропонує тип даних HierarchyId , що допомагає підходити до рядка Lineage Column та розширювати глибину, яку можна представити.
Closure Tables
перевершуютьAdjacency List
,Path Enumeration
іNested Sets
з точки зору простоти використання (і я припускаю , що продуктивність, а).