多个用户的一个嵌套集 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));
}
}
}
}
}
如果之前有人问过这个问题,我深表歉意,但我想知道是否有人对为潜在数千名用户使用一个嵌套集 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));
}
}
}
}
}