Моделювання ієрархічних даних за допомогою таблиць замикання

closure table — це спосіб моделювати деревоподібні дані в реляційних базах даних. Це включає дві таблиці: таблиця node та таблиця closure.

pic

pic

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

Leave a Reply

Your email address will not be published. Required fields are marked *