cakephp - 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 关联的策略更改为“选择”会导致太多、不必要的单独查询。
我想知道是否有人听说过最佳实践,或者是否有满足这种需求的行为。我想到的事情:
- 在运行查询之前,分析包含多少会导致 JOIN 的关联,以及会导致额外 JOIN 的任何其他内容(查询中的“join”子句,LinkableBehavior)。如果超过限制,则通过修改它们的“策略”将其中一些变成单独的 SELECT。
- 不知何故,通过收集 id 来聚合 JOINS 来自属于指向同一个表的关联,并在查询运行后“分发”结果。对 hasMany 关联所做的那种事情,但是结果被转换为实体,然后所有这些实体都作为一个属性添加(包含结果数组),而对于 belongsTo,我们需要将结果分配回不同的属性主要型号。
解决方案
推荐阅读
- sql - 如何编写 SQL 代码来显示对数据值进行分类
- node.js - Microsoft teams bot adaptive card carousel deleting a card
- ionic-framework - Ionic 4 Selects Not Working in Firefox Responsive Design Mode
- python - 使用 python 脚本向 Kubernetes 集群发送请求
- go - Error - redigo.Scan: Cannot convert from Redis bulk string to *string
- html - 带有粘性标题的表格上的水平滚动条
- karate - 我们可以在空手道 API 自动化工具中使用 jar 文件处理多部分请求吗?
- sql-server - T-SQL 查询过滤导致无限执行
- java - Attribute returns Null Pointer Exception
- html - Visual Studio Code 二 html元素编辑问题