仅缓存 FuelPHP ORM 结果中的关系数据

Posted

技术标签:

【中文标题】仅缓存 FuelPHP ORM 结果中的关系数据【英文标题】:Caching only a relation data from FuelPHP ORM result 【发布时间】:2014-09-12 16:41:10 【问题描述】:

我正在使用 Fuelphpmysql 开发应用程序,并且正在使用提供的 ORM 功能。问题出在下表:

表:pdm_data

海量表格(350 多列,多行) 表格数据相当静态(每天仅更新一次) 主键:obj_id

表:change_request

只有几列 数据变化频繁(10-20次/分钟) 引用主键(来自表 pdm_data 的 obj_id)

用户可以自定义对他们可见的数据表,例如。他们可以在列上保存过滤器(例如 change_request.obj_id=34 AND pdm_data.state = 6),然后将这些过滤器转换为使用 ORM 进行实时查询。

但是,使用 ORM 进行查询确实很慢,因为表 pdm_data 很大,甚至大约 100 行也会产生许多 mbs 的数据。最大的问题似乎在 FuelPHP ORM 中:即使查询本身是相对较快的模型水合等,也需要很多秒。理想的解决方案是缓存来自 pdm_data 表的结果,因为它是相当静态的。但是,据我所知,FuelPHP 不允许您通过关系缓存表(您可以缓存查询的完整结果,因此两个表或一个都没有)。

此外,使用带有连接而不是 ORM 的普通 SQL 查询不是理想的解决方案,因为我需要处理水合模型很棒的其他任务。

我目前有以下代码:

 //Initialize the query and use eager-loading
 $query = Model_Changerequest::query()->related('pdmdata');


foreach($filters as $filter)

 //First parameter can point to either table
 $query->where($filter[0], $filter[1], $filter[2]);


$result = $query->get();

...

有人对此有好的解决方案吗?

感谢阅读!

【问题讨论】:

【参考方案1】:

版本 1 ORM 的缓慢是一个已知问题,正在 v2 中解决。我当前的基准测试显示 v1 orm 需要 2.5 秒(在我的机器上,ymmv)来水合 40k 行,而当前的 v2 alpha 需要大约 800 毫秒。

目前恐怕最简单的解决方案是取消大型选择的 ORM 并使用 DB 类构建查询。我知道您说过要保留 ORM 的抽象以简化开发,一种解决方案是使用 as_object('MyModel') 返回填充的模型对象。

另一方面,如果性能是您主要关心的问题,那么 ORM 根本不适合。

【讨论】:

以上是关于仅缓存 FuelPHP ORM 结果中的关系数据的主要内容,如果未能解决你的问题,请参考以下文章

Fuelphp ORM添加到模型属性时出现意外结果

FuelPhp 关系查询作为单一结果

Fuelphp属于关系,不同的模型

在fuelphp中查询数据库的更好方法是啥?

如何在 FuelPHP 中为关系查询添加条件?

使用 FuelPHP 从 ORM 返回 _data 数组