【问题标题】:Laravel's polymorphic relationships performanceLaravel 多态关系性能
【发布时间】:2018-01-03 01:00:43
【问题描述】:

有没有人有在 Laravel 中执行多态关系的经验?我需要有几个不同模型的设置表,多态关系在这里会很好,我想知道性能,是否每个模型都有自己的设置表一样好?

设置表很简单,这就是设置表的样子:

$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('key');
$table->string('value')->nullable();

我会削减每个模型设置所需的几个表,只是想知道使用多态设置是否会出现性能问题?

如果我决定使用多态,那么我会将这些类型添加到表中:

        $table->string('has_settings_type');
        $table->biginteger('has_settings_id')->unsigned();

这就是 laravel 添加对多态关系的支持所需要的。

【问题讨论】:

  • 你可能有点野心勃勃地使用 biginteger 作为外键,只需要整数就可以了
  • Wordpress 使用大整数。我正在制作一个 CMS,所以我想保证安全,而不是以后必须更改它
  • 也使用了 biginteger,因为模型使用 bigincrease,然后您必须使用 biginteger 才能创建外键。

标签: laravel laravel-5 eloquent


【解决方案1】:

只要向表中添加正确的索引,性能就不会成为多态关系的问题。

但是,您的表缺少一个使其具有多态性的字段,您需要与该设置相关的模型名称。

$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('foreign_object');                       // Object name (e.g.: 'App\User')
$table->string('key');
$table->string('value')->nullable();

$table->index(['foreign_id', 'foreign_object']);        // To get all settings for an object
$table->index(['foreign_id', 'foreign_object', 'key']); // To get single key for an object

【讨论】:

  • 顺便说一句,您创建的那些索引,它们将如何提供帮助,获取对象的所有设置或获取单个键?你能举个例子吗?索引会加速一切吗?
  • 像上面提到的那样的复合索引是一种数据结构,它允许对这些属性的组合执行有效的查询。因此,您可以像往常一样进行查询,其余的由数据库完成。
  • 为了安全起见,我还建议添加外键约束。对于设置,cascase 可能是最好的
  • 嗨 Steel,您的意思是更新/删除时的级联?我认为您不能在多态设置中使用外键约束。
  • 只是为了更好地理解上面的索引将使这个 Setting::where('foreign_id', 1)->where('foreign_object', 'App\Abc')->first() 更快?我使用的是正确的语法还是我必须以其他方式查询才能从索引中获取速度?
【解决方案2】:

如果您使用少于5.2.34,则不会急切加载超过多态关系的关系。您可以阅读有关此问题的更多信息here。一个例子是如果images 是多态的,而你做到了:

->with('product.images.sources');

sources 不会被预先加载。

【讨论】:

  • 所以如果多态关系本身有关系,它们不会被急切加载?我不相信我会遇到这种情况,大多数情况下都不会这样做:)
  • 仅当您使用低于 5.2.34 的 Laravel 版本时
【解决方案3】:

对 Jerodev 的回答进行了改进。 索引顺序很重要。

通常你会想搜索类似这样的内容
get all settings for a given model (foreign_object)

如果你保持这样的索引顺序(foreign_id,foreign_object),那么sql将无法使用索引来执行上述查询,因为索引中最左边的列不是foreign_object

因此索引应该是这样的

$table->index(['foreign_object', 'foreign_id']);
$table->index(['foreign_object', 'foreign_id', 'key']);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 2015-06-30
    • 2017-05-13
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2016-01-26
    相关资源
    最近更新 更多