closure table — це спосіб моделювати деревоподібні дані в реляційних базах даних. Це включає дві таблиці: таблиця node
та таблиця closure
.
root -> child a -> grandchild та root -> child b
Я завантажив базу даних у db fiddle, щоб погратись з нею https://www.db-fiddle.com/f/vZzmioVV5E3f4iR86pTbj7/0
Переваги:
Легко запитувати нащадків та предків заданого вузла:
-- отримати предка
SELECT descendant FROM closure_table WHERE ancestor = 2;
-- отримати предка
SELECT ancestor FROM closure_table WHERE descendant = 4;
Недоліки:
Вставка даних ускладнена. Щоб додати новий вузол, потрібно зробити одну вставку в таблицю вузлів та кілька вставок у таблицю closure, по одному для кожного предка.
-- приклад вставки вузла 4, 'Grandchild'
INSERT INTO nodes (id, name) VALUES
(4, 'Grandchild');
-- відносини в closure_table
INSERT INTO closure_table (ancestor, descendant, depth) VALUES
-- відносини Grandchild
(1, 4, 2), -- Root до Grandchild
(2, 4, 1), -- Child A до Grandchild
(4, 4, 0); -- Grandchild є своїм власним предком
Ми можемо використовувати цей підхід, коли запити на читання частіші, ніж запити на запис.
Перекладено з: modelling hierarchical data using closure tables