多个用户的一个嵌套集 Table

One Nested Set Table for Multiple Users

如果之前有人问过这个问题,我深表歉意,但我想知道是否有人对为潜在数千名用户使用一个嵌套集 table 的性能有任何见解?

我需要每个注册用户都能够创建无限嵌套类别。现在,我的结构是 belongsToMany() 关系:

users -> user_categories (pivot) -> categories

用户只能访问自己的类别,不能修改其他用户的类别。

一个嵌套集内的(可能)数万条记录是否会对性能造成巨大影响 table?每个用户是否应该获得自己的嵌套集类别 table?

提前致谢!

嵌套集允许在单个查询中获取节点的所有后代,因此对于 reading 类别,性能命中将类似于普通(非嵌套集) table。当您 插入 时,嵌套集的缺点就会出现,因为它需要在插入后更新 table 中所有记录的左右值。

因此性能影响将取决于您插入的频率和插入的大小。

如果不是拥有一棵大树,而是每个用户有一个根节点,所有节点都存储在同一个 table 中,则可以显着减少开销,因此插入将只涉及更新一个小子树.

如果您想自己测试性能,可以使用 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));
                }
            }
        }
    }
}