Одна таблица вложенных множеств для нескольких пользователей

Я прошу прощения, если об этом уже спрашивали, однако мне интересно, есть ли у кого-нибудь понимание производительности наличия одной вложенной таблицы набора для потенциально тысяч пользователей?

Мне нужно, чтобы каждый зарегистрированный пользователь мог создавать бесконечные вложенные категории. Прямо сейчас моя структура belongsToMany() связь:

users -> user_categories (pivot) -> categories

Пользователи будут иметь доступ только к своим категориям и не смогут изменять категории других пользователей.

Будет ли существенное снижение производительности (потенциально) десятков тысяч записей в одной таблице вложенных множеств? Должен ли каждый пользователь получать свою собственную таблицу категорий вложенных множеств?

Заранее спасибо!

0

Решение

Вложенные наборы позволяют извлекать всех потомков узла в одном запросе, поэтому для чтение По категориям попадание в производительность будет таким же, как в обычной (не вложенной) таблице. Недостаток вложенных наборов возникает, когда вы вставка потому что это требует обновления левого и правого значений для всех записей в таблице после вставки.

Таким образом, снижение производительности будет зависеть от того, как часто вы вставляете и насколько велики ваши вставки.

Вы можете значительно сократить накладные расходы, если вместо одного большого дерева у вас будет один корневой узел на пользователя, и все они будут храниться в одной таблице, и, следовательно, вставки будут включать обновление только небольшого поддерева.

Если вы хотите проверить производительность самостоятельно, вы можете использовать Laravel Baum Упакуйте и используйте эту сеялку, чтобы увидеть, как выполняется вставка 26 * 10 * 3 категорий:

<?php

use App\Category;
use Illuminate\Database\Seeder;

class CategoriesTableSeeder extends Seeder
{
public function run()
{
// Helper function to populate model attributes
$node = function () {
$args = implode(' ', func_get_args());

return ['name' => "Category $args"];
};

// Create first level nodes
foreach(range('A', 'Z') as $letter)
{
$node0 = Category::create($node($letter));

// Create second level nodes
foreach(range(1, 10) as $number)
{
$node1 = $node0->children()->create($node($letter, $number));

// Create third level nodes
foreach(['Δ', 'Σ', 'Ω'] as $greek)
{
$node2 = $node1->children()->create($node($letter, $number, $greek));
}
}
}
}
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]