Как оптимизировать вставку в БД вложенной древовидной структурой?

Есть многоуровневая древовидная структура, получаемая с клиента

[
    'name' => 'text1'
    'children' => [
        ['name' => 'text2', 'children' => []],
        [
            'name' => 'text3'
            'children' => [
                ['name' => 'text4', 'children' => []],
                ['name' => 'text5', 'children' => []],
                ['name' => 'text6', 'children' => []],
            ]
        ],
    ]
]

Стандартная: узел дерева и его потомки, с бесконечной вложенностью.

Как можнозанести все эти записи в БД оптимизированно? Наибольшей эффективностью.

У меня на уме только два способа:

  1. Делать вставки рекурсивно в БД. Т.е. вставляется родитель, берётся у него id, потом вставляются его потомки с parent_id, который только что получили, у них тоже получаем id и вставляем их потомков с parent_id указывающим на них.

    Это легко сделать, но, боюсь, что это очень неэффективно, т.к. по сути, на 100 узлов будет 100 INSERT'ов (ну или каждую пачку детей можно через один INSERT записывать, но всё равно неэффективно).

  2. Взять последний id в базе, даже заблокировать таблицу для записи, рассчитать все идентификаторы заранее и вписать их в массив. И уже одним инсертом вставить в БД.

    Этот способ мне не нравится, потому что надо блокировать всю таблицу на время рассчёта идентификаторов на сервере и их вставки.

Есть ли ещё способы вставки такой структуры?


Ответы (0 шт):