首页 > 解决方案 > CakePHP:包含许多属于关联的关联导致数据库运行到 JOIN 限制

问题描述

我们目前使用的是 CakePHP 3.7.5,使用 MariaDB 作为我们的数据库引擎(开发者为 10.4.12,客户端机器上为 10.2、10.2)。

我们的一些表类有很多 belongsTo 关联。其中许多指向联系人表,但更多指向选项表。我们使用该表来存储模型不同属性的任意值,以便客户端可以自己管理这些列表、添加条目或更改其文本表示,同时保留引用的 id。

主表:实体

id INT(11)
name VARCHAR(256)
administrator_contact_id INT(11)
account_manager_contact_id INT(11)
property_manager_contact_id INT(11)
...
type_id INT(11)
classification_id INT(11)
status_id INT(11)
category_id INT(11)
...

联系人表

id INT(11)
first_name VARCHAR(256)
last_name VARCHAR(256)

选项表

id INT(11)
name VARCHAR(256)

实体表类

class EntitiesTable extends Table
{
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->addAssociations([
            'belongsTo' => [
                'AdministratorContact' => [
                    'className' => 'Contacts',
                ],
                'AccountManagerContact' => [
                    'className' => 'Contacts',
                ],
                'PropertyManagerContact' => [
                    'className' => 'Contacts',
                ],
                ...
                'Type' => [
                    'className' => 'Options',
                ],
                'Classification' => [
                    'className' => 'Options',
                ],
                'Status' => [
                    'className' => 'Options',
                ],
                'Category' => [
                    'className' => 'Options',
                ],
                ...
            ],
            ...
        ]);
    }
}

控制器中的示例查询

$this->loadModel('Entities');
$query = $this->Entities->find('all', [
    'conditions' => [
        ...
    ],
    'contain' => [
        'AdministratorContact',
        'AccountManagerContact',
        'PropertyManagerContact',
        ...
        'Type',
        'Classification',
        'Status',
        'Category',
        ....
    ],
]);
$results = $query->toArray();

现在,我们第一次遇到了 MariaDB 61 JOIN 的限制。我们的 belongsTo 关联是使用默认的“join”策略添加的,因为它减少了为服务单个请求而必须执行的查询总数。将所有 belongsTo 关联的策略更改为“选择”会导致太多、不必要的单独查询。

我想知道是否有人听说过最佳实践,或者是否有满足这种需求的行为。我想到的事情:

标签: cakephpcakephp-3.0

解决方案


推荐阅读